Skip to content

Commit ca34f42

Browse files
committed
AST: Introduce UnmetAvailabilityRequirement::isConditionallySatisfiable().
1 parent 5dc654c commit ca34f42

File tree

4 files changed

+22
-7
lines changed

4 files changed

+22
-7
lines changed

include/swift/AST/Availability.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,10 @@ class UnmetAvailabilityRequirement {
401401
/// `std::nullopt` otherwise.
402402
std::optional<AvailabilityRange>
403403
getRequiredNewerAvailabilityRange(ASTContext &ctx) const;
404+
405+
/// Returns true if this unmet requirement can be satisfied by introducing an
406+
/// `if #available(...)` condition in source.
407+
bool isConditionallySatisfiable() const;
404408
};
405409

406410
class AvailabilityInference {

lib/AST/Availability.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ UnmetAvailabilityRequirement::getRequiredNewerAvailabilityRange(
7777
}
7878
}
7979

80+
bool UnmetAvailabilityRequirement::isConditionallySatisfiable() const {
81+
switch (kind) {
82+
case Kind::AlwaysUnavailable:
83+
case Kind::RequiresVersion:
84+
case Kind::Obsoleted:
85+
return false;
86+
case Kind::IntroducedInNewerVersion:
87+
return true;
88+
}
89+
}
90+
8091
namespace {
8192

8293
/// The inferred availability required to access a group of declarations

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4140,12 +4140,8 @@ bool swift::diagnoseDeclAvailability(const ValueDecl *D, SourceRange R,
41404140

41414141
auto unmetRequirement =
41424142
getUnmetDeclAvailabilityRequirement(D, DC, Where.getAvailability());
4143-
auto requiredRange =
4144-
unmetRequirement
4145-
? unmetRequirement->getRequiredNewerAvailabilityRange(ctx)
4146-
: std::nullopt;
41474143

4148-
if (unmetRequirement && !requiredRange) {
4144+
if (unmetRequirement && !unmetRequirement->isConditionallySatisfiable()) {
41494145
// FIXME: diagnoseExplicitUnavailability should take an unmet requirement
41504146
if (diagnoseExplicitUnavailability(D, R, Where, call, Flags))
41514147
return true;
@@ -4169,6 +4165,11 @@ bool swift::diagnoseDeclAvailability(const ValueDecl *D, SourceRange R,
41694165
&& isa<ProtocolDecl>(D))
41704166
return false;
41714167

4168+
if (!unmetRequirement)
4169+
return false;
4170+
4171+
auto requiredRange = unmetRequirement->getRequiredNewerAvailabilityRange(ctx);
4172+
41724173
// Diagnose (and possibly signal) for potential unavailability
41734174
if (!requiredRange)
41744175
return false;

lib/Sema/TypeCheckPattern.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,11 @@ using namespace swift;
3939
static EnumElementDecl *
4040
extractEnumElement(DeclContext *DC, SourceLoc UseLoc,
4141
const VarDecl *constant) {
42-
auto &ctx = DC->getASTContext();
4342
auto availabilityContext = TypeChecker::availabilityAtLocation(UseLoc, DC);
4443
if (auto requirement = getUnmetDeclAvailabilityRequirement(
4544
constant, DC, availabilityContext)) {
4645
// Only diagnose explicit unavailability.
47-
if (!requirement->getRequiredNewerAvailabilityRange(ctx))
46+
if (!requirement->isConditionallySatisfiable())
4847
diagnoseDeclAvailability(constant, UseLoc, nullptr,
4948
ExportContext::forFunctionBody(DC, UseLoc));
5049
}

0 commit comments

Comments
 (0)