Skip to content

Commit b4fb7c8

Browse files
committed
AST: Refactor AvailabilityQuery constructors.
Get rid of the boolean arguments for unavailability in AvailabilityQuery's constructors and introduce a `asUnavailable()` modifier that can be used instead in the contexts where unavailability is relevant.
1 parent 78f50ba commit b4fb7c8

File tree

6 files changed

+37
-33
lines changed

6 files changed

+37
-33
lines changed

include/swift/AST/AvailabilityQuery.h

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,40 +46,50 @@ class AvailabilityQuery final {
4646
bool unavailable;
4747

4848
AvailabilityQuery(AvailabilityDomain domain, ResultKind kind,
49-
bool isUnavailable,
5049
const std::optional<AvailabilityRange> &primaryRange,
5150
const std::optional<AvailabilityRange> &variantRange)
5251
: domain(domain), primaryRange(primaryRange), variantRange(variantRange),
53-
kind(kind), unavailable(isUnavailable) {};
52+
kind(kind), unavailable(false) {};
5453

5554
public:
5655
/// Returns an `AvailabilityQuery` for a query that evaluates to true or
5756
/// false at compile-time.
58-
static AvailabilityQuery constant(AvailabilityDomain domain,
59-
bool isUnavailable, bool value) {
57+
static AvailabilityQuery constant(AvailabilityDomain domain, bool value) {
6058
return AvailabilityQuery(
6159
domain, value ? ResultKind::ConstTrue : ResultKind::ConstFalse,
62-
isUnavailable, std::nullopt, std::nullopt);
60+
std::nullopt, std::nullopt);
6361
}
6462

6563
/// Returns an `AvailabilityQuery` for a query that evaluates to true or
6664
/// false at compile-time in the universal availability domain.
67-
static AvailabilityQuery universallyConstant(bool isUnavailable, bool value) {
65+
static AvailabilityQuery universallyConstant(bool value) {
6866
return AvailabilityQuery(AvailabilityDomain::forUniversal(),
6967
value ? ResultKind::ConstTrue
7068
: ResultKind::ConstFalse,
71-
isUnavailable, std::nullopt, std::nullopt);
69+
std::nullopt, std::nullopt);
7270
}
7371

7472
/// Returns an `AvailabilityQuery` for a query that must be evaluated at
7573
/// runtime with the given arguments, which may be zero, one, or two version
7674
/// tuples that should be passed to the query function.
7775
static AvailabilityQuery
78-
dynamic(AvailabilityDomain domain, bool isUnavailable,
76+
dynamic(AvailabilityDomain domain,
7977
const std::optional<AvailabilityRange> &primaryRange,
8078
const std::optional<AvailabilityRange> &variantRange) {
81-
return AvailabilityQuery(domain, ResultKind::Dynamic, isUnavailable,
82-
primaryRange, variantRange);
79+
return AvailabilityQuery(domain, ResultKind::Dynamic, primaryRange,
80+
variantRange);
81+
}
82+
83+
/// Returns a copy of the `AvailabilityQuery` that has been modified to
84+
/// represent an `if #unavailable` query if `isUnavailability` is true, or an
85+
/// `if #available` query otherwise.
86+
AvailabilityQuery asUnavailable(bool isUnavailability) const {
87+
if (isUnavailability != unavailable) {
88+
AvailabilityQuery copy = *this;
89+
copy.unavailable = isUnavailability;
90+
return copy;
91+
}
92+
return *this;
8393
}
8494

8595
/// Returns the domain that the query applies to.

lib/AST/AvailabilityScopeBuilder.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -816,8 +816,7 @@ class AvailabilityScopeBuilder : private ASTWalker {
816816

817817
AvailabilityQuery buildAvailabilityQuery(
818818
const SemanticAvailabilitySpec spec,
819-
const std::optional<SemanticAvailabilitySpec> &variantSpec,
820-
bool isUnavailability) {
819+
const std::optional<SemanticAvailabilitySpec> &variantSpec) {
821820
auto domain = spec.getDomain();
822821

823822
// Variant availability specfications are only supported for platform
@@ -850,37 +849,34 @@ class AvailabilityScopeBuilder : private ASTWalker {
850849
// If all of the specs that matched are '*', then the query trivially
851850
// evaluates to "true" at compile time.
852851
if (!variantRange)
853-
return AvailabilityQuery::constant(domain, isUnavailability, true);
852+
return AvailabilityQuery::constant(domain, true);
854853

855854
// Otherwise, generate a dynamic query for the variant spec. For example,
856855
// when compiling zippered for macOS, this should generate a query that
857856
// just checks the iOS version at runtime:
858857
//
859858
// if #available(iOS 18, *) { ... }
860859
//
861-
return AvailabilityQuery::dynamic(variantSpec->getDomain(),
862-
isUnavailability, primaryRange,
860+
return AvailabilityQuery::dynamic(variantSpec->getDomain(), primaryRange,
863861
variantRange);
864862

865863
case AvailabilityDomain::Kind::Platform:
866864
// Platform checks are always dynamic. The SIL optimizer is responsible
867865
// eliminating these checks when it can prove that they can never fail
868866
// (due to the deployment target). We can't perform that analysis here
869867
// because it may depend on inlining.
870-
return AvailabilityQuery::dynamic(domain, isUnavailability, primaryRange,
871-
variantRange);
868+
return AvailabilityQuery::dynamic(domain, primaryRange, variantRange);
872869
case AvailabilityDomain::Kind::Custom:
873870
auto customDomain = domain.getCustomDomain();
874871
ASSERT(customDomain);
875872

876873
switch (customDomain->getKind()) {
877874
case CustomAvailabilityDomain::Kind::Enabled:
878-
return AvailabilityQuery::constant(domain, isUnavailability, true);
875+
return AvailabilityQuery::constant(domain, true);
879876
case CustomAvailabilityDomain::Kind::Disabled:
880-
return AvailabilityQuery::constant(domain, isUnavailability, false);
877+
return AvailabilityQuery::constant(domain, false);
881878
case CustomAvailabilityDomain::Kind::Dynamic:
882-
return AvailabilityQuery::dynamic(domain, isUnavailability,
883-
primaryRange, variantRange);
879+
return AvailabilityQuery::dynamic(domain, primaryRange, variantRange);
884880
}
885881
}
886882
}
@@ -1053,8 +1049,9 @@ class AvailabilityScopeBuilder : private ASTWalker {
10531049
? bestActiveSpecForQuery(query, /*ForTargetVariant*/ true)
10541050
: std::nullopt;
10551051

1056-
query->setAvailabilityQuery(buildAvailabilityQuery(
1057-
*spec, variantSpec, query->isUnavailability()));
1052+
query->setAvailabilityQuery(
1053+
buildAvailabilityQuery(*spec, variantSpec)
1054+
.asUnavailable(query->isUnavailability()));
10581055

10591056
// Wildcards are expected to be "useless". There may be other specs in
10601057
// this query that are useful when compiling for other platforms.

lib/SILGen/SILGenAvailability.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,14 +131,13 @@ getAvailabilityQueryForBackDeployment(AbstractFunctionDecl *AFD) {
131131
variantRange = variantAttrAndRange->second;
132132

133133
return AvailabilityQuery::dynamic(attr->getAvailabilityDomain(),
134-
/*isUnavailable=*/false, primaryRange,
135-
variantRange);
134+
primaryRange, variantRange);
136135
}
137136

138137
if (auto primaryAttrAndRange = AFD->getBackDeployedAttrAndRange(ctx))
139138
return AvailabilityQuery::dynamic(
140139
primaryAttrAndRange->first->getAvailabilityDomain(),
141-
/*isUnavailable=*/false, primaryAttrAndRange->second, std::nullopt);
140+
primaryAttrAndRange->second, std::nullopt);
142141

143142
return std::nullopt;
144143
}

lib/Sema/DerivedConformance/DerivedConformanceRawRepresentable.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,7 @@ struct RuntimeVersionCheck {
218218
// This won't be filled in by TypeCheckAvailability because we have
219219
// invalid SourceLocs in this area of the AST.
220220
availableInfo->setAvailabilityQuery(AvailabilityQuery::dynamic(
221-
domain, /*isUnavailable=*/false, AvailabilityRange(getVersionRange()),
222-
std::nullopt));
221+
domain, AvailabilityRange(getVersionRange()), std::nullopt));
223222

224223
// earlyReturnBody = "{ return nil }"
225224
auto earlyReturn = new (C) FailStmt(SourceLoc(), SourceLoc());

lib/Sema/MiscDiagnostics.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3787,9 +3787,7 @@ class OpaqueUnderlyingTypeChecker : public ASTWalker {
37873787
// Add universally available choice as the last one.
37883788
conditionalSubstitutions.push_back(
37893789
OpaqueTypeDecl::ConditionallyAvailableSubstitutions::get(
3790-
Ctx,
3791-
{AvailabilityQuery::universallyConstant(/*isUnavailable=*/false,
3792-
/*value=*/true)},
3790+
Ctx, {AvailabilityQuery::universallyConstant(true)},
37933791
universalSubstMap.mapReplacementTypesOutOfContext()));
37943792

37953793
OpaqueDecl->setConditionallyAvailableSubstitutions(

lib/Serialization/Deserialization.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4592,7 +4592,8 @@ class DeclDeserializer {
45924592
DECODE_VER_TUPLE(version);
45934593

45944594
queries.push_back(AvailabilityQuery::dynamic(
4595-
domain, isUnavailability, AvailabilityRange(version), std::nullopt));
4595+
domain, AvailabilityRange(version), std::nullopt)
4596+
.asUnavailable(isUnavailability));
45964597
}
45974598
}
45984599

@@ -4731,7 +4732,7 @@ class DeclDeserializer {
47314732
OpaqueTypeDecl::ConditionallyAvailableSubstitutions::get(
47324733
ctx,
47334734
{AvailabilityQuery::universallyConstant(
4734-
/*isUnavailable=*/false, /*value=*/true)},
4735+
/*value=*/true)},
47354736
subMapOrError.get()));
47364737

47374738
opaqueDecl->setConditionallyAvailableSubstitutions(limitedAvailability);

0 commit comments

Comments
 (0)