@@ -181,6 +181,8 @@ const char InvalidEnumValueError::ID = '\0';
181
181
void InvalidEnumValueError::anchor () {}
182
182
const char ConformanceXRefError::ID = ' \0 ' ;
183
183
void ConformanceXRefError::anchor () {}
184
+ const char InavalidAvailabilityDomainError::ID = ' \0 ' ;
185
+ void InavalidAvailabilityDomainError::anchor () {}
184
186
185
187
// / Skips a single record in the bitstream.
186
188
// /
@@ -5720,35 +5722,79 @@ ModuleFile::getDeclChecked(
5720
5722
return declOrOffset;
5721
5723
}
5722
5724
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
+
5723
5765
Expected<AvailableAttr *>
5724
5766
DeclDeserializer::readAvailable_DECL_ATTR (SmallVectorImpl<uint64_t > &scratch,
5725
5767
StringRef blobData) {
5726
5768
bool isImplicit;
5727
5769
bool isUnavailable;
5728
5770
bool isDeprecated;
5729
5771
bool isNoAsync;
5730
- bool isPackageDescriptionVersionSpecific;
5731
5772
bool isSPI;
5732
- bool isForEmbedded;
5773
+ uint8_t rawDomainKind;
5774
+ unsigned rawPlatform;
5775
+ DeclID domainDeclID;
5733
5776
DEF_VER_TUPLE_PIECES (Introduced);
5734
5777
DEF_VER_TUPLE_PIECES (Deprecated);
5735
5778
DEF_VER_TUPLE_PIECES (Obsoleted);
5736
- unsigned rawPlatform, messageSize, renameSize;
5779
+ unsigned messageSize, renameSize;
5737
5780
5738
5781
// Decode the record, pulling the version tuple information.
5739
5782
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 ,
5742
5785
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" );
5745
5791
5746
5792
auto maybePlatform = platformFromUnsigned (rawPlatform);
5747
5793
if (!maybePlatform.has_value ())
5748
5794
return llvm::make_error<InvalidEnumValueError>(rawPlatform, " PlatformKind" );
5749
5795
5750
- PlatformKind platform = maybePlatform. value () ;
5751
-
5796
+ AvailabilityDomainKind domainKind = *maybeDomainKind ;
5797
+ PlatformKind platform = *maybePlatform;
5752
5798
StringRef message = blobData.substr (0 , messageSize);
5753
5799
blobData = blobData.substr (messageSize);
5754
5800
StringRef rename = blobData.substr (0 , renameSize);
@@ -5767,23 +5813,19 @@ DeclDeserializer::readAvailable_DECL_ATTR(SmallVectorImpl<uint64_t> &scratch,
5767
5813
else
5768
5814
kind = AvailableAttr::Kind::Default;
5769
5815
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));
5781
5819
}
5782
5820
5821
+ auto domain = decodeAvailabilityDomain (domainKind, platform, domainDecl, ctx);
5822
+ if (!domain)
5823
+ return llvm::make_error<InavalidAvailabilityDomainError>();
5824
+
5783
5825
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);
5787
5829
return attr;
5788
5830
}
5789
5831
0 commit comments