@@ -826,15 +826,18 @@ void DeclAttributes::print(ASTPrinter &Printer, const PrintOptions &Options,
826826 // Be careful not to coalesce `@available(swift 5)` with other short
827827 // `available' attributes.
828828 if (auto *availableAttr = dyn_cast<AvailableAttr>(DA)) {
829- auto domain = D->getDomainForAvailableAttr (availableAttr);
830- auto semanticAttr = SemanticAvailableAttr (availableAttr, domain);
831- if (isShortAvailable (semanticAttr)) {
829+ auto semanticAttr = D->getSemanticAvailableAttr (availableAttr);
830+ if (!semanticAttr)
831+ continue ;
832+
833+ auto domain = semanticAttr->getDomain ();
834+ if (isShortAvailable (*semanticAttr)) {
832835 if (domain.isSwiftLanguage ())
833- swiftVersionAvailableAttribute.emplace (semanticAttr);
836+ swiftVersionAvailableAttribute.emplace (* semanticAttr);
834837 else if (domain.isPackageDescription ())
835- packageDescriptionVersionAvailableAttribute.emplace (semanticAttr);
838+ packageDescriptionVersionAvailableAttribute.emplace (* semanticAttr);
836839 else
837- shortAvailableAttributes.push_back (semanticAttr);
840+ shortAvailableAttributes.push_back (* semanticAttr);
838841
839842 continue ;
840843 }
@@ -912,6 +915,10 @@ ParsedDeclAttrFilter::operator()(const DeclAttribute *Attr) const {
912915 return Attr;
913916}
914917
918+ bool SemanticAvailableAttr::isActive (ASTContext &ctx) const {
919+ return domain.isActive (ctx);
920+ }
921+
915922std::optional<SemanticAvailableAttr>
916923SemanticAvailableAttributes::Filter::operator ()(
917924 const DeclAttribute *attr) const {
@@ -922,11 +929,14 @@ SemanticAvailableAttributes::Filter::operator()(
922929 if (availableAttr->isInvalid ())
923930 return std::nullopt ;
924931
925- auto domain = decl->getDomainForAvailableAttr (availableAttr);
926- if (!includeInactive && !domain. isActive (decl-> getASTContext ()) )
932+ auto semanticAttr = decl->getSemanticAvailableAttr (availableAttr);
933+ if (!semanticAttr )
927934 return std::nullopt ;
928935
929- return SemanticAvailableAttr (availableAttr, domain);
936+ if (!includeInactive && !semanticAttr->isActive (decl->getASTContext ()))
937+ return std::nullopt ;
938+
939+ return *semanticAttr;
930940}
931941
932942static void printAvailableAttr (const Decl *D,
@@ -1164,8 +1174,9 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
11641174
11651175 case DeclAttrKind::Available: {
11661176 auto Attr = cast<AvailableAttr>(this );
1167- auto Domain = D->getDomainForAvailableAttr (Attr);
1168- auto SemanticAttr = SemanticAvailableAttr (Attr, Domain);
1177+ auto SemanticAttr = D->getSemanticAvailableAttr (Attr);
1178+ if (!SemanticAttr)
1179+ return false ;
11691180
11701181 if (Options.printPublicInterface () && Attr->isSPI ()) {
11711182 assert (Attr->hasPlatform ());
@@ -1190,7 +1201,7 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
11901201 Printer.printAttrName (" @available" );
11911202 }
11921203 Printer << " (" ;
1193- printAvailableAttr (D, SemanticAttr, Printer, Options);
1204+ printAvailableAttr (D, * SemanticAttr, Printer, Options);
11941205 Printer << " )" ;
11951206 break ;
11961207 }
@@ -1286,8 +1297,8 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
12861297 Printer << " target: " << target << " , " ;
12871298 SmallVector<SemanticAvailableAttr, 8 > semanticAvailAttrs;
12881299 for (auto availAttr : attr->getAvailableAttrs ()) {
1289- auto domain = D->getDomainForAvailableAttr (availAttr);
1290- semanticAvailAttrs.push_back (SemanticAvailableAttr (availAttr, domain) );
1300+ if ( auto semanticAttr = D->getSemanticAvailableAttr (availAttr))
1301+ semanticAvailAttrs.push_back (*semanticAttr );
12911302 }
12921303
12931304 if (!semanticAvailAttrs.empty ()) {
0 commit comments