Skip to content

Commit 862dccf

Browse files
committed
AST: Adopt availability constraints query in AvailabilityContext.
Call `swift::getAvailabilityConstraintsForDecl()` to gather the constraints that should be added to an AvailabilityContext when constraining it to the availability of a given declaration.
1 parent 19a0b93 commit 862dccf

File tree

2 files changed

+30
-12
lines changed

2 files changed

+30
-12
lines changed

include/swift/AST/AvailabilityContextStorage.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
namespace swift {
2525

26+
class DeclAvailabilityConstraints;
27+
2628
/// Summarizes availability the constraints contained by an AvailabilityContext.
2729
class AvailabilityContext::Info {
2830
public:
@@ -41,9 +43,11 @@ class AvailabilityContext::Info {
4143
/// of adding this constraint.
4244
bool constrainWith(const Info &other);
4345

44-
/// Updates each field to reflect the availability of `decl`, if that
45-
/// availability is more restrictive. Returns true if any field was updated.
46-
bool constrainWith(const Decl *decl);
46+
/// Constrains each field using the given constraints if they are more
47+
/// restrictive than the current values. Returns true if any field was
48+
/// updated.
49+
bool constrainWith(const DeclAvailabilityConstraints &constraints,
50+
ASTContext &ctx);
4751

4852
bool constrainUnavailability(std::optional<AvailabilityDomain> domain);
4953

lib/AST/AvailabilityContext.cpp

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "swift/AST/AvailabilityContext.h"
1414
#include "swift/AST/ASTContext.h"
15+
#include "swift/AST/AvailabilityConstraint.h"
1516
#include "swift/AST/AvailabilityContextStorage.h"
1617
#include "swift/AST/AvailabilityInference.h"
1718
#include "swift/AST/Decl.h"
@@ -63,16 +64,27 @@ bool AvailabilityContext::Info::constrainWith(const Info &other) {
6364
return isConstrained;
6465
}
6566

66-
bool AvailabilityContext::Info::constrainWith(const Decl *decl) {
67+
bool AvailabilityContext::Info::constrainWith(
68+
const DeclAvailabilityConstraints &constraints, ASTContext &ctx) {
6769
bool isConstrained = false;
6870

69-
if (auto range = AvailabilityInference::annotatedAvailableRange(decl))
70-
isConstrained |= constrainRange(Range, *range);
71-
72-
if (auto attr = decl->getUnavailableAttr())
73-
isConstrained |= constrainUnavailability(attr->getDomain());
74-
75-
isConstrained |= CONSTRAIN_BOOL(IsDeprecated, decl->isDeprecated());
71+
for (auto constraint : constraints) {
72+
auto attr = constraint.getAttr();
73+
auto domain = attr.getDomain();
74+
switch (constraint.getKind()) {
75+
case AvailabilityConstraint::Kind::AlwaysUnavailable:
76+
case AvailabilityConstraint::Kind::Obsoleted:
77+
case AvailabilityConstraint::Kind::RequiresVersion:
78+
isConstrained |= constrainUnavailability(domain);
79+
break;
80+
case AvailabilityConstraint::Kind::IntroducedInNewerVersion:
81+
// FIXME: [availability] Support versioning for other kinds of domains.
82+
DEBUG_ASSERT(domain.isPlatform());
83+
if (domain.isPlatform())
84+
isConstrained |= constrainRange(Range, attr.getIntroducedRange(ctx));
85+
break;
86+
}
87+
}
7688

7789
return isConstrained;
7890
}
@@ -190,7 +202,9 @@ void AvailabilityContext::constrainWithDeclAndPlatformRange(
190202
bool isConstrained = false;
191203

192204
Info info{storage->info};
193-
isConstrained |= info.constrainWith(decl);
205+
auto constraints = swift::getAvailabilityConstraintsForDecl(decl, *this);
206+
isConstrained |= info.constrainWith(constraints, decl->getASTContext());
207+
isConstrained |= CONSTRAIN_BOOL(info.IsDeprecated, decl->isDeprecated());
194208
isConstrained |= constrainRange(info.Range, platformRange);
195209

196210
if (!isConstrained)

0 commit comments

Comments
 (0)