@@ -423,8 +423,7 @@ AvailabilityInference::annotatedAvailableRange(const Decl *D, ASTContext &Ctx) {
423423}
424424
425425bool Decl::isAvailableAsSPI () const {
426- return AvailabilityInference::availableRange (this , getASTContext ())
427- .isAvailableAsSPI ();
426+ return AvailabilityInference::isAvailableAsSPI (this , getASTContext ());
428427}
429428
430429std::optional<AvailableAttrDeclPair>
@@ -550,13 +549,10 @@ AvailabilityInference::annotatedAvailableRangeForAttr(const SpecializeAttr* attr
550549 return AvailabilityContext::alwaysAvailable ();
551550}
552551
553- AvailabilityContext AvailabilityInference::availableRange (const Decl *D,
554- ASTContext &Ctx) {
555- std::optional<AvailabilityContext> AnnotatedRange =
556- annotatedAvailableRange (D, Ctx);
557- if (AnnotatedRange.has_value ()) {
558- return AnnotatedRange.value ();
559- }
552+ static const AvailableAttr *attrForAvailableRange (const Decl *D,
553+ ASTContext &Ctx) {
554+ if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange (D, Ctx))
555+ return attr;
560556
561557 // Unlike other declarations, extensions can be used without referring to them
562558 // by name (they don't have one) in the source. For this reason, when checking
@@ -568,16 +564,30 @@ AvailabilityContext AvailabilityInference::availableRange(const Decl *D,
568564
569565 DeclContext *DC = D->getDeclContext ();
570566 if (auto *ED = dyn_cast<ExtensionDecl>(DC)) {
571- AnnotatedRange = annotatedAvailableRange (ED, Ctx);
572- if (AnnotatedRange.has_value ()) {
573- return AnnotatedRange.value ();
574- }
567+ if (auto attr =
568+ AvailabilityInference::attrForAnnotatedAvailableRange (ED, Ctx))
569+ return attr;
575570 }
576571
572+ return nullptr ;
573+ }
574+
575+ AvailabilityContext AvailabilityInference::availableRange (const Decl *D,
576+ ASTContext &Ctx) {
577+ if (auto attr = attrForAvailableRange (D, Ctx))
578+ return availableRange (attr, Ctx);
579+
577580 // Treat unannotated declarations as always available.
578581 return AvailabilityContext::alwaysAvailable ();
579582}
580583
584+ bool AvailabilityInference::isAvailableAsSPI (const Decl *D, ASTContext &Ctx) {
585+ if (auto attr = attrForAvailableRange (D, Ctx))
586+ return attr->IsSPI ;
587+
588+ return false ;
589+ }
590+
581591AvailabilityContext
582592AvailabilityInference::availableRange (const AvailableAttr *attr,
583593 ASTContext &Ctx) {
@@ -590,8 +600,7 @@ AvailabilityInference::availableRange(const AvailableAttr *attr,
590600 attr, Ctx, Platform, RemappedIntroducedVersion))
591601 IntroducedVersion = RemappedIntroducedVersion;
592602
593- return AvailabilityContext{VersionRange::allGTE (IntroducedVersion),
594- attr->IsSPI };
603+ return AvailabilityContext{VersionRange::allGTE (IntroducedVersion)};
595604}
596605
597606namespace {
0 commit comments