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.
This commit is contained in:
Allan Shortlidge
2025-08-28 11:30:17 -07:00
parent 95dc7df0c6
commit 707c4aa52c
3 changed files with 39 additions and 25 deletions

View File

@@ -240,6 +240,14 @@ std::optional<AvailabilityConstraint> getAvailabilityConstraintForDeclInDomain(
const Decl *decl, const AvailabilityContext &context,
AvailabilityDomain domain,
AvailabilityConstraintFlags flags = std::nullopt);
/// Computes the set of constraints that indicate whether a decl is "runtime
/// unavailable" (can never be reached at runtime) and adds the domain for each
/// of those constraints to the \p domains vector.
void getRuntimeUnavailableDomains(
const DeclAvailabilityConstraints &constraints,
llvm::SmallVectorImpl<AvailabilityDomain> &domains, const ASTContext &ctx);
} // end namespace swift
namespace llvm {

View File

@@ -574,27 +574,6 @@ getRootTargetDomains(const ASTContext &ctx) {
return domains;
}
static bool constraintIndicatesRuntimeUnavailability(
const AvailabilityConstraint &constraint, const ASTContext &ctx) {
std::optional<CustomAvailabilityDomain::Kind> customDomainKind;
if (auto customDomain = constraint.getDomain().getCustomDomain())
customDomainKind = customDomain->getKind();
switch (constraint.getReason()) {
case AvailabilityConstraint::Reason::UnavailableUnconditionally:
if (customDomainKind)
return customDomainKind == CustomAvailabilityDomain::Kind::Enabled;
return true;
case AvailabilityConstraint::Reason::UnavailableObsolete:
case AvailabilityConstraint::Reason::UnavailableUnintroduced:
return false;
case AvailabilityConstraint::Reason::Unintroduced:
if (customDomainKind)
return customDomainKind == CustomAvailabilityDomain::Kind::Disabled;
return false;
}
}
/// Returns true if a decl that is unavailable in the given domain must still be
/// emitted to preserve load time ABI compatibility.
static bool
@@ -633,10 +612,7 @@ computeDeclRuntimeAvailability(const Decl *decl) {
// First, collect the unavailable domains from the constraints.
llvm::SmallVector<AvailabilityDomain, 8> unavailableDomains;
for (auto constraint : constraints) {
if (constraintIndicatesRuntimeUnavailability(constraint, ctx))
unavailableDomains.push_back(constraint.getDomain());
}
getRuntimeUnavailableDomains(constraints, unavailableDomains, ctx);
// Check whether there are any available attributes that would make the
// decl available in descendants of the unavailable domains.

View File

@@ -322,3 +322,33 @@ swift::getAvailabilityConstraintForDeclInDomain(
return std::nullopt;
}
static bool constraintIndicatesRuntimeUnavailability(
const AvailabilityConstraint &constraint, const ASTContext &ctx) {
std::optional<CustomAvailabilityDomain::Kind> customDomainKind;
if (auto customDomain = constraint.getDomain().getCustomDomain())
customDomainKind = customDomain->getKind();
switch (constraint.getReason()) {
case AvailabilityConstraint::Reason::UnavailableUnconditionally:
if (customDomainKind)
return customDomainKind == CustomAvailabilityDomain::Kind::Enabled;
return true;
case AvailabilityConstraint::Reason::UnavailableObsolete:
case AvailabilityConstraint::Reason::UnavailableUnintroduced:
return false;
case AvailabilityConstraint::Reason::Unintroduced:
if (customDomainKind)
return customDomainKind == CustomAvailabilityDomain::Kind::Disabled;
return false;
}
}
void swift::getRuntimeUnavailableDomains(
const DeclAvailabilityConstraints &constraints,
llvm::SmallVectorImpl<AvailabilityDomain> &domains, const ASTContext &ctx) {
for (auto constraint : constraints) {
if (constraintIndicatesRuntimeUnavailability(constraint, ctx))
domains.push_back(constraint.getDomain());
}
}