Skip to content

Commit dcfe563

Browse files
committed
AST: Remove AvailabilityInference::availableRangeAndAttr()
1 parent efa1aff commit dcfe563

File tree

4 files changed

+23
-38
lines changed

4 files changed

+23
-38
lines changed

include/swift/AST/AvailabilityInference.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,6 @@ class AvailabilityInference {
4646
/// Returns the range of platform versions in which the decl is available.
4747
static AvailabilityRange availableRange(const Decl *D);
4848

49-
/// Returns the range of platform versions in which the decl is available and
50-
/// the attribute which determined this range (which may be `nullptr` if the
51-
/// declaration is always available.
52-
static std::pair<AvailabilityRange, const AvailableAttr *>
53-
availableRangeAndAttr(const Decl *D);
54-
5549
/// Returns true is the declaration is `@_spi_available`.
5650
static bool isAvailableAsSPI(const Decl *D);
5751

lib/AST/Availability.cpp

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -430,11 +430,11 @@ bool AvailabilityInference::updateBeforePlatformForFallback(
430430
return false;
431431
}
432432

433-
std::optional<SemanticAvailableAttr>
434-
Decl::getAvailableAttrForPlatformIntroduction() const {
433+
static std::optional<SemanticAvailableAttr>
434+
getDeclAvailableAttrForPlatformIntroduction(const Decl *D) {
435435
std::optional<SemanticAvailableAttr> bestAvailAttr;
436436

437-
auto D = abstractSyntaxDeclForAvailableAttribute(this);
437+
D = abstractSyntaxDeclForAvailableAttribute(D);
438438

439439
for (auto attr : D->getSemanticAvailableAttrs(/*includingInactive=*/false)) {
440440
if (!attr.isPlatformSpecific() || !attr.getIntroduced())
@@ -790,9 +790,9 @@ AvailabilityRange AvailabilityInference::annotatedAvailableRangeForAttr(
790790
return AvailabilityRange::alwaysAvailable();
791791
}
792792

793-
static std::optional<SemanticAvailableAttr>
794-
attrForAvailableRange(const Decl *D) {
795-
if (auto attr = D->getAvailableAttrForPlatformIntroduction())
793+
std::optional<SemanticAvailableAttr>
794+
Decl::getAvailableAttrForPlatformIntroduction() const {
795+
if (auto attr = getDeclAvailableAttrForPlatformIntroduction(this))
796796
return attr;
797797

798798
// Unlike other declarations, extensions can be used without referring to them
@@ -803,31 +803,24 @@ attrForAvailableRange(const Decl *D) {
803803
// itself. This check relies on the fact that we cannot have nested
804804
// extensions.
805805

806-
DeclContext *DC = D->getDeclContext();
806+
DeclContext *DC = getDeclContext();
807807
if (auto *ED = dyn_cast<ExtensionDecl>(DC)) {
808-
if (auto attr = ED->getAvailableAttrForPlatformIntroduction())
808+
if (auto attr = getDeclAvailableAttrForPlatformIntroduction(ED))
809809
return attr;
810810
}
811811

812812
return std::nullopt;
813813
}
814814

815-
std::pair<AvailabilityRange, const AvailableAttr *>
816-
AvailabilityInference::availableRangeAndAttr(const Decl *D) {
817-
if (auto rangeAttr = attrForAvailableRange(D))
818-
return {rangeAttr->getIntroducedRange(D->getASTContext()),
819-
rangeAttr->getParsedAttr()};
820-
821-
// Treat unannotated declarations as always available.
822-
return {AvailabilityRange::alwaysAvailable(), nullptr};
823-
}
824-
825815
AvailabilityRange AvailabilityInference::availableRange(const Decl *D) {
826-
return availableRangeAndAttr(D).first;
816+
if (auto attr = D->getAvailableAttrForPlatformIntroduction())
817+
return attr->getIntroducedRange(D->getASTContext());
818+
819+
return AvailabilityRange::alwaysAvailable();
827820
}
828821

829822
bool AvailabilityInference::isAvailableAsSPI(const Decl *D) {
830-
if (auto attr = attrForAvailableRange(D))
823+
if (auto attr = D->getAvailableAttrForPlatformIntroduction())
831824
return attr->getParsedAttr()->isSPI();
832825

833826
return false;

lib/Sema/TypeCheckAttr.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2264,10 +2264,10 @@ static Decl *getEnclosingDeclForDecl(Decl *D) {
22642264
return D->getDeclContext()->getInnermostDeclarationDeclContext();
22652265
}
22662266

2267-
static std::optional<std::pair<const AvailableAttr *, const Decl *>>
2267+
static std::optional<std::pair<SemanticAvailableAttr, const Decl *>>
22682268
getSemanticAvailableRangeDeclAndAttr(const Decl *decl) {
22692269
if (auto attr = decl->getAvailableAttrForPlatformIntroduction())
2270-
return std::make_pair(attr->getParsedAttr(), decl);
2270+
return std::make_pair(*attr, decl);
22712271

22722272
if (auto *parent =
22732273
AvailabilityInference::parentDeclForInferredAvailability(decl))
@@ -2383,11 +2383,8 @@ void AttributeChecker::visitAvailableAttr(AvailableAttr *attr) {
23832383
if (auto *parent = getEnclosingDeclForDecl(D)) {
23842384
if (auto enclosingAvailable =
23852385
getSemanticAvailableRangeDeclAndAttr(parent)) {
2386-
const Decl *enclosingDecl = enclosingAvailable.value().second;
2387-
SemanticAvailableAttr enclosingAttr =
2388-
enclosingDecl
2389-
->getSemanticAvailableAttr(enclosingAvailable.value().first)
2390-
.value();
2386+
SemanticAvailableAttr enclosingAttr = enclosingAvailable->first;
2387+
const Decl *enclosingDecl = enclosingAvailable->second;
23912388
EnclosingAnnotatedRange.emplace(enclosingAttr.getIntroducedRange(Ctx));
23922389
if (!AttrRange.isContainedIn(*EnclosingAnnotatedRange)) {
23932390
auto limit = DiagnosticBehavior::Unspecified;
@@ -5021,7 +5018,7 @@ void AttributeChecker::checkBackDeployedAttrs(
50215018
getSemanticAvailableRangeDeclAndAttr(VD)) {
50225019
auto beforePlatformString = prettyPlatformString(Attr->Platform);
50235020
auto beforeVersion = Attr->Version;
5024-
auto availableAttr = availableRangeAttrPair.value().first;
5021+
auto availableAttr = availableRangeAttrPair.value().first.getParsedAttr();
50255022
auto introVersion = availableAttr->Introduced.value();
50265023
StringRef introPlatformString = availableAttr->prettyPlatformString();
50275024

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3182,10 +3182,11 @@ swift::getUnsatisfiedAvailabilityConstraint(
31823182
}
31833183

31843184
// Check whether the declaration is available in a newer platform version.
3185-
auto rangeAndAttr = AvailabilityInference::availableRangeAndAttr(decl);
3186-
if (!availabilityContext.getPlatformRange().isContainedIn(rangeAndAttr.first))
3187-
return AvailabilityConstraint::forIntroducedInNewerVersion(
3188-
decl->getSemanticAvailableAttr(rangeAndAttr.second).value());
3185+
if (auto rangeAttr = decl->getAvailableAttrForPlatformIntroduction()) {
3186+
auto range = rangeAttr->getIntroducedRange(ctx);
3187+
if (!availabilityContext.getPlatformRange().isContainedIn(range))
3188+
return AvailabilityConstraint::forIntroducedInNewerVersion(*rangeAttr);
3189+
}
31893190

31903191
return std::nullopt;
31913192
}

0 commit comments

Comments
 (0)