Skip to content

Commit 707c4aa

Browse files
committed
AST: Factor out a utility for computing runtime unavailability.
In anticipation of needing to compute runtime unavailability to determine whether declarations should be printed in swiftinterfaces, factor out the code that computes runtime unavailability into a shared utility based on `DeclAvailabilityConstraints`. NFC.
1 parent 95dc7df commit 707c4aa

File tree

3 files changed

+39
-25
lines changed

3 files changed

+39
-25
lines changed

include/swift/AST/AvailabilityConstraint.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,14 @@ std::optional<AvailabilityConstraint> getAvailabilityConstraintForDeclInDomain(
240240
const Decl *decl, const AvailabilityContext &context,
241241
AvailabilityDomain domain,
242242
AvailabilityConstraintFlags flags = std::nullopt);
243+
244+
/// Computes the set of constraints that indicate whether a decl is "runtime
245+
/// unavailable" (can never be reached at runtime) and adds the domain for each
246+
/// of those constraints to the \p domains vector.
247+
void getRuntimeUnavailableDomains(
248+
const DeclAvailabilityConstraints &constraints,
249+
llvm::SmallVectorImpl<AvailabilityDomain> &domains, const ASTContext &ctx);
250+
243251
} // end namespace swift
244252

245253
namespace llvm {

lib/AST/Availability.cpp

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -574,27 +574,6 @@ getRootTargetDomains(const ASTContext &ctx) {
574574
return domains;
575575
}
576576

577-
static bool constraintIndicatesRuntimeUnavailability(
578-
const AvailabilityConstraint &constraint, const ASTContext &ctx) {
579-
std::optional<CustomAvailabilityDomain::Kind> customDomainKind;
580-
if (auto customDomain = constraint.getDomain().getCustomDomain())
581-
customDomainKind = customDomain->getKind();
582-
583-
switch (constraint.getReason()) {
584-
case AvailabilityConstraint::Reason::UnavailableUnconditionally:
585-
if (customDomainKind)
586-
return customDomainKind == CustomAvailabilityDomain::Kind::Enabled;
587-
return true;
588-
case AvailabilityConstraint::Reason::UnavailableObsolete:
589-
case AvailabilityConstraint::Reason::UnavailableUnintroduced:
590-
return false;
591-
case AvailabilityConstraint::Reason::Unintroduced:
592-
if (customDomainKind)
593-
return customDomainKind == CustomAvailabilityDomain::Kind::Disabled;
594-
return false;
595-
}
596-
}
597-
598577
/// Returns true if a decl that is unavailable in the given domain must still be
599578
/// emitted to preserve load time ABI compatibility.
600579
static bool
@@ -633,10 +612,7 @@ computeDeclRuntimeAvailability(const Decl *decl) {
633612

634613
// First, collect the unavailable domains from the constraints.
635614
llvm::SmallVector<AvailabilityDomain, 8> unavailableDomains;
636-
for (auto constraint : constraints) {
637-
if (constraintIndicatesRuntimeUnavailability(constraint, ctx))
638-
unavailableDomains.push_back(constraint.getDomain());
639-
}
615+
getRuntimeUnavailableDomains(constraints, unavailableDomains, ctx);
640616

641617
// Check whether there are any available attributes that would make the
642618
// decl available in descendants of the unavailable domains.

lib/AST/AvailabilityConstraint.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,3 +322,33 @@ swift::getAvailabilityConstraintForDeclInDomain(
322322

323323
return std::nullopt;
324324
}
325+
326+
static bool constraintIndicatesRuntimeUnavailability(
327+
const AvailabilityConstraint &constraint, const ASTContext &ctx) {
328+
std::optional<CustomAvailabilityDomain::Kind> customDomainKind;
329+
if (auto customDomain = constraint.getDomain().getCustomDomain())
330+
customDomainKind = customDomain->getKind();
331+
332+
switch (constraint.getReason()) {
333+
case AvailabilityConstraint::Reason::UnavailableUnconditionally:
334+
if (customDomainKind)
335+
return customDomainKind == CustomAvailabilityDomain::Kind::Enabled;
336+
return true;
337+
case AvailabilityConstraint::Reason::UnavailableObsolete:
338+
case AvailabilityConstraint::Reason::UnavailableUnintroduced:
339+
return false;
340+
case AvailabilityConstraint::Reason::Unintroduced:
341+
if (customDomainKind)
342+
return customDomainKind == CustomAvailabilityDomain::Kind::Disabled;
343+
return false;
344+
}
345+
}
346+
347+
void swift::getRuntimeUnavailableDomains(
348+
const DeclAvailabilityConstraints &constraints,
349+
llvm::SmallVectorImpl<AvailabilityDomain> &domains, const ASTContext &ctx) {
350+
for (auto constraint : constraints) {
351+
if (constraintIndicatesRuntimeUnavailability(constraint, ctx))
352+
domains.push_back(constraint.getDomain());
353+
}
354+
}

0 commit comments

Comments
 (0)