Skip to content

Commit a6b20b3

Browse files
committed
AST: Re-introduce AvailabilityConstraint::Kind.
Now the Kind enum classifies availability constraints based on their satisfiablility. NFC.
1 parent e87f808 commit a6b20b3

7 files changed

+41
-26
lines changed

Diff for: include/swift/AST/AvailabilityConstraint.h

+30-4
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ class AvailabilityConstraint {
6161
IntroducedInLaterDynamicVersion,
6262
};
6363

64+
/// Classifies constraints into different high level categories.
65+
enum class Kind {
66+
/// There are no contexts in which the declaration would be available.
67+
Unavailable,
68+
69+
/// There are some contexts in which the declaration would be available if
70+
/// additional constraints were added.
71+
PotentiallyAvailable,
72+
};
73+
6474
private:
6575
llvm::PointerIntPair<SemanticAvailableAttr, 2, Reason> attrAndReason;
6676

@@ -93,6 +103,26 @@ class AvailabilityConstraint {
93103
return static_cast<SemanticAvailableAttr>(attrAndReason.getPointer());
94104
}
95105

106+
Kind getKind() const {
107+
switch (getReason()) {
108+
case Reason::UnconditionallyUnavailable:
109+
case Reason::Obsoleted:
110+
case Reason::IntroducedInLaterVersion:
111+
return Kind::Unavailable;
112+
case Reason::IntroducedInLaterDynamicVersion:
113+
return Kind::PotentiallyAvailable;
114+
}
115+
}
116+
117+
/// Returns true if the constraint cannot be satisfied at runtime.
118+
bool isUnavailable() const { return getKind() == Kind::Unavailable; }
119+
120+
/// Returns true if the constraint is unsatisfied but could be satisfied at
121+
/// runtime in a more constrained context.
122+
bool isPotentiallyAvailable() const {
123+
return getKind() == Kind::PotentiallyAvailable;
124+
}
125+
96126
/// Returns the domain that the constraint applies to.
97127
AvailabilityDomain getDomain() const { return getAttr().getDomain(); }
98128

@@ -105,10 +135,6 @@ class AvailabilityConstraint {
105135
std::optional<AvailabilityRange>
106136
getRequiredNewerAvailabilityRange(ASTContext &ctx) const;
107137

108-
/// Returns true if this unmet requirement can be satisfied by introducing an
109-
/// `if #available(...)` condition in source.
110-
bool isConditionallySatisfiable() const;
111-
112138
/// Some availability constraints are active for type-checking but cannot
113139
/// be translated directly into an `if #available(...)` runtime query.
114140
bool isActiveForRuntimeQueries(ASTContext &ctx) const;

Diff for: lib/AST/AvailabilityConstraint.cpp

-11
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,6 @@ AvailabilityConstraint::getRequiredNewerAvailabilityRange(
3535
}
3636
}
3737

38-
bool AvailabilityConstraint::isConditionallySatisfiable() const {
39-
switch (getReason()) {
40-
case Reason::UnconditionallyUnavailable:
41-
case Reason::Obsoleted:
42-
case Reason::IntroducedInLaterVersion:
43-
return false;
44-
case Reason::IntroducedInLaterDynamicVersion:
45-
return true;
46-
}
47-
}
48-
4938
bool AvailabilityConstraint::isActiveForRuntimeQueries(ASTContext &ctx) const {
5039
if (getAttr().getPlatform() == PlatformKind::none)
5140
return true;

Diff for: lib/Sema/CSSyntacticElement.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2467,7 +2467,7 @@ class ResultBuilderRewriter : public SyntacticElementSolutionApplication {
24672467

24682468
auto constraint = getUnsatisfiedAvailabilityConstraint(
24692469
nominal, context.getAsDeclContext(), loc);
2470-
if (constraint && constraint->isConditionallySatisfiable()) {
2470+
if (constraint && constraint->isPotentiallyAvailable()) {
24712471
auto &ctx = getASTContext();
24722472
ctx.Diags.diagnose(loc,
24732473
diag::result_builder_missing_limited_availability,

Diff for: lib/Sema/ConstraintSystem.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -4918,11 +4918,11 @@ bool ConstraintSystem::isReadOnlyKeyPathComponent(
49184918
// If the setter is unavailable, then the keypath ought to be read-only
49194919
// in this context.
49204920
if (auto setter = storage->getOpaqueAccessor(AccessorKind::Set)) {
4921-
// FIXME: Fully unavailable setters should cause the key path to be
4922-
// readonly too.
4921+
// FIXME: [availability] Fully unavailable setters should cause the key path
4922+
// to be readonly too.
49234923
auto constraint =
49244924
getUnsatisfiedAvailabilityConstraint(setter, DC, referenceLoc);
4925-
if (constraint && constraint->isConditionallySatisfiable())
4925+
if (constraint && constraint->isPotentiallyAvailable())
49264926
return true;
49274927
}
49284928

Diff for: lib/Sema/DerivedConformanceRawRepresentable.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -247,15 +247,15 @@ checkAvailability(const EnumElementDecl *elt,
247247
if (!constraint)
248248
return true;
249249

250+
// Is it never available?
251+
if (constraint->isUnavailable())
252+
return false;
253+
250254
// Some constraints are active for type checking but can't translate to
251255
// runtime restrictions.
252256
if (!constraint->isActiveForRuntimeQueries(C))
253257
return true;
254258

255-
// Is it never available?
256-
if (!constraint->isConditionallySatisfiable())
257-
return false;
258-
259259
// It's conditionally available; create a version constraint and return true.
260260
auto platform = constraint->getPlatform();
261261
auto range = constraint->getRequiredNewerAvailabilityRange(C);

Diff for: lib/Sema/TypeCheckAvailability.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -3031,7 +3031,7 @@ bool diagnoseExplicitUnavailability(SourceLoc loc,
30313031
const ExportContext &where,
30323032
bool warnIfConformanceUnavailablePreSwift6,
30333033
bool preconcurrency) {
3034-
if (constraint.isConditionallySatisfiable())
3034+
if (!constraint.isUnavailable())
30353035
return false;
30363036

30373037
// Invertible protocols are never unavailable.
@@ -3464,7 +3464,7 @@ bool diagnoseExplicitUnavailability(
34643464
const ExportContext &Where, DeclAvailabilityFlags Flags,
34653465
llvm::function_ref<void(InFlightDiagnostic &, StringRef)>
34663466
attachRenameFixIts) {
3467-
if (constraint.isConditionallySatisfiable())
3467+
if (!constraint.isUnavailable())
34683468
return false;
34693469

34703470
auto Attr = constraint.getAttr();

Diff for: lib/Sema/TypeCheckPattern.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static EnumElementDecl *extractEnumElement(DeclContext *DC, SourceLoc UseLoc,
4141
if (auto constraint =
4242
getUnsatisfiedAvailabilityConstraint(constant, DC, UseLoc)) {
4343
// Only diagnose explicit unavailability.
44-
if (!constraint->isConditionallySatisfiable())
44+
if (constraint->isUnavailable())
4545
diagnoseDeclAvailability(constant, UseLoc, nullptr,
4646
ExportContext::forFunctionBody(DC, UseLoc));
4747
}

0 commit comments

Comments
 (0)