mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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:
@@ -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 {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user