@@ -430,11 +430,11 @@ bool AvailabilityInference::updateBeforePlatformForFallback(
430
430
return false ;
431
431
}
432
432
433
- const AvailableAttr *
434
- AvailabilityInference::attrForAnnotatedAvailableRange ( const Decl *D) {
433
+ std::optional<SemanticAvailableAttr>
434
+ Decl::getAvailableAttrForPlatformIntroduction () const {
435
435
std::optional<SemanticAvailableAttr> bestAvailAttr;
436
436
437
- D = abstractSyntaxDeclForAvailableAttribute (D );
437
+ auto D = abstractSyntaxDeclForAvailableAttribute (this );
438
438
439
439
for (auto attr : D->getSemanticAvailableAttrs (/* includingInactive=*/ false )) {
440
440
if (!attr.isPlatformSpecific () || !attr.getIntroduced ())
@@ -444,16 +444,16 @@ AvailabilityInference::attrForAnnotatedAvailableRange(const Decl *D) {
444
444
bestAvailAttr.emplace (attr);
445
445
}
446
446
447
- return bestAvailAttr ? bestAvailAttr-> getParsedAttr () : nullptr ;
447
+ return bestAvailAttr;
448
448
}
449
449
450
450
std::optional<AvailabilityRange>
451
451
AvailabilityInference::annotatedAvailableRange (const Decl *D) {
452
- auto bestAvailAttr = attrForAnnotatedAvailableRange (D );
452
+ auto bestAvailAttr = D-> getAvailableAttrForPlatformIntroduction ( );
453
453
if (!bestAvailAttr)
454
454
return std::nullopt;
455
455
456
- return availableRange (bestAvailAttr, D->getASTContext ());
456
+ return availableRange (bestAvailAttr-> getParsedAttr () , D->getASTContext ());
457
457
}
458
458
459
459
bool Decl::isAvailableAsSPI () const {
@@ -790,8 +790,9 @@ AvailabilityRange AvailabilityInference::annotatedAvailableRangeForAttr(
790
790
return AvailabilityRange::alwaysAvailable ();
791
791
}
792
792
793
- static const AvailableAttr *attrForAvailableRange (const Decl *D) {
794
- if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange (D))
793
+ static std::optional<SemanticAvailableAttr>
794
+ attrForAvailableRange (const Decl *D) {
795
+ if (auto attr = D->getAvailableAttrForPlatformIntroduction ())
795
796
return attr;
796
797
797
798
// Unlike other declarations, extensions can be used without referring to them
@@ -804,16 +805,17 @@ static const AvailableAttr *attrForAvailableRange(const Decl *D) {
804
805
805
806
DeclContext *DC = D->getDeclContext ();
806
807
if (auto *ED = dyn_cast<ExtensionDecl>(DC)) {
807
- if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange (ED ))
808
+ if (auto attr = ED-> getAvailableAttrForPlatformIntroduction ( ))
808
809
return attr;
809
810
}
810
811
811
- return nullptr ;
812
+ return std::nullopt ;
812
813
}
813
814
814
815
std::pair<AvailabilityRange, const AvailableAttr *>
815
816
AvailabilityInference::availableRangeAndAttr (const Decl *D) {
816
- if (auto attr = attrForAvailableRange (D)) {
817
+ if (auto rangeAttr = attrForAvailableRange (D)) {
818
+ auto attr = rangeAttr->getParsedAttr ();
817
819
return {availableRange (attr, D->getASTContext ()), attr};
818
820
}
819
821
@@ -827,7 +829,7 @@ AvailabilityRange AvailabilityInference::availableRange(const Decl *D) {
827
829
828
830
bool AvailabilityInference::isAvailableAsSPI (const Decl *D) {
829
831
if (auto attr = attrForAvailableRange (D))
830
- return attr->isSPI ();
832
+ return attr->getParsedAttr ()-> isSPI ();
831
833
832
834
return false ;
833
835
}
0 commit comments