|
12 | 12 |
|
13 | 13 | #include "swift/AST/AvailabilityContext.h"
|
14 | 14 | #include "swift/AST/ASTContext.h"
|
| 15 | +#include "swift/AST/AvailabilityConstraint.h" |
15 | 16 | #include "swift/AST/AvailabilityContextStorage.h"
|
16 | 17 | #include "swift/AST/AvailabilityInference.h"
|
17 | 18 | #include "swift/AST/Decl.h"
|
@@ -63,16 +64,27 @@ bool AvailabilityContext::Info::constrainWith(const Info &other) {
|
63 | 64 | return isConstrained;
|
64 | 65 | }
|
65 | 66 |
|
66 |
| -bool AvailabilityContext::Info::constrainWith(const Decl *decl) { |
| 67 | +bool AvailabilityContext::Info::constrainWith( |
| 68 | + const DeclAvailabilityConstraints &constraints, ASTContext &ctx) { |
67 | 69 | bool isConstrained = false;
|
68 | 70 |
|
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 | + } |
76 | 88 |
|
77 | 89 | return isConstrained;
|
78 | 90 | }
|
@@ -190,7 +202,9 @@ void AvailabilityContext::constrainWithDeclAndPlatformRange(
|
190 | 202 | bool isConstrained = false;
|
191 | 203 |
|
192 | 204 | 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()); |
194 | 208 | isConstrained |= constrainRange(info.Range, platformRange);
|
195 | 209 |
|
196 | 210 | if (!isConstrained)
|
|
0 commit comments