@@ -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
// /
@@ -5727,35 +5729,79 @@ ModuleFile::getDeclChecked(
5727
5729
return declOrOffset;
5728
5730
}
5729
5731
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
+
5730
5772
Expected<AvailableAttr *>
5731
5773
DeclDeserializer::readAvailable_DECL_ATTR (SmallVectorImpl<uint64_t > &scratch,
5732
5774
StringRef blobData) {
5733
5775
bool isImplicit;
5734
5776
bool isUnavailable;
5735
5777
bool isDeprecated;
5736
5778
bool isNoAsync;
5737
- bool isPackageDescriptionVersionSpecific;
5738
5779
bool isSPI;
5739
- bool isForEmbedded;
5780
+ uint8_t rawDomainKind;
5781
+ unsigned rawPlatform;
5782
+ DeclID domainDeclID;
5740
5783
DEF_VER_TUPLE_PIECES (Introduced);
5741
5784
DEF_VER_TUPLE_PIECES (Deprecated);
5742
5785
DEF_VER_TUPLE_PIECES (Obsoleted);
5743
- unsigned rawPlatform, messageSize, renameSize;
5786
+ unsigned messageSize, renameSize;
5744
5787
5745
5788
// Decode the record, pulling the version tuple information.
5746
5789
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 ,
5749
5792
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" );
5752
5798
5753
5799
auto maybePlatform = platformFromUnsigned (rawPlatform);
5754
5800
if (!maybePlatform.has_value ())
5755
5801
return llvm::make_error<InvalidEnumValueError>(rawPlatform, " PlatformKind" );
5756
5802
5757
- PlatformKind platform = maybePlatform. value () ;
5758
-
5803
+ AvailabilityDomainKind domainKind = *maybeDomainKind ;
5804
+ PlatformKind platform = *maybePlatform;
5759
5805
StringRef message = blobData.substr (0 , messageSize);
5760
5806
blobData = blobData.substr (messageSize);
5761
5807
StringRef rename = blobData.substr (0 , renameSize);
@@ -5774,23 +5820,19 @@ DeclDeserializer::readAvailable_DECL_ATTR(SmallVectorImpl<uint64_t> &scratch,
5774
5820
else
5775
5821
kind = AvailableAttr::Kind::Default;
5776
5822
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));
5788
5826
}
5789
5827
5828
+ auto domain = decodeAvailabilityDomain (domainKind, platform, domainDecl, ctx);
5829
+ if (!domain)
5830
+ return llvm::make_error<InavalidAvailabilityDomainError>();
5831
+
5790
5832
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);
5794
5836
return attr;
5795
5837
}
5796
5838
0 commit comments