Skip to content

Commit b3f6421

Browse files
committed
AST: Remove DeclAttributes::getPotentiallyUnavailable().
This utility duplicated logic that is now meant to be encapsulated by `getUnsatisfiedAvailabilityConstraint()`.
1 parent c3f8352 commit b3f6421

File tree

5 files changed

+40
-68
lines changed

5 files changed

+40
-68
lines changed

include/swift/AST/Attr.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2932,11 +2932,6 @@ class DeclAttributes {
29322932
findMostSpecificActivePlatform(const ASTContext &ctx,
29332933
bool ignoreAppExtensions = false) const;
29342934

2935-
/// Returns the first @available attribute that indicates
2936-
/// a declaration is unavailable, or the first one that indicates it's
2937-
/// potentially unavailable, or null otherwise.
2938-
const AvailableAttr *getPotentiallyUnavailable(const ASTContext &ctx) const;
2939-
29402935
/// Returns the first @available attribute that indicates
29412936
/// a declaration is unavailable, or null otherwise.
29422937
const AvailableAttr *getUnavailable(const ASTContext &ctx,

include/swift/AST/AvailabilityConstraint.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ class AvailabilityConstraint {
8787
Kind getKind() const { return kind; }
8888
const AvailableAttr *getAttr() const { return attr; }
8989

90+
/// Returns the platform that this constraint applies to, or
91+
/// `PlatformKind::none` if it is not platform specific.
92+
PlatformKind getPlatform() const;
93+
9094
/// Returns the required range for `IntroducedInNewerVersion` requirements, or
9195
/// `std::nullopt` otherwise.
9296
std::optional<AvailabilityRange>
@@ -95,6 +99,10 @@ class AvailabilityConstraint {
9599
/// Returns true if this unmet requirement can be satisfied by introducing an
96100
/// `if #available(...)` condition in source.
97101
bool isConditionallySatisfiable() const;
102+
103+
/// Some availability constraints are active for type-checking but cannot
104+
/// be translated directly into an `if #available(...)` runtime query.
105+
bool isActiveForRuntimeQueries(ASTContext &ctx) const;
98106
};
99107

100108
} // end namespace swift

lib/AST/Attr.cpp

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -427,48 +427,6 @@ DeclAttributes::findMostSpecificActivePlatform(const ASTContext &ctx,
427427
return bestAttr;
428428
}
429429

430-
const AvailableAttr *
431-
DeclAttributes::getPotentiallyUnavailable(const ASTContext &ctx) const {
432-
const AvailableAttr *potential = nullptr;
433-
const AvailableAttr *conditional = nullptr;
434-
435-
for (auto Attr : *this)
436-
if (auto AvAttr = dyn_cast<AvailableAttr>(Attr)) {
437-
if (AvAttr->isInvalid())
438-
continue;
439-
440-
if (!AvAttr->isActivePlatform(ctx) &&
441-
!AvAttr->isLanguageVersionSpecific() &&
442-
!AvAttr->isPackageDescriptionVersionSpecific())
443-
continue;
444-
445-
// Definitely not available.
446-
if (AvAttr->isUnconditionallyUnavailable())
447-
return AvAttr;
448-
449-
switch (AvAttr->getVersionAvailability(ctx)) {
450-
case AvailableVersionComparison::Available:
451-
// Doesn't limit the introduced version.
452-
break;
453-
454-
case AvailableVersionComparison::PotentiallyUnavailable:
455-
// We'll return this if we don't see something that proves it's
456-
// not available in this version.
457-
potential = AvAttr;
458-
break;
459-
460-
case AvailableVersionComparison::Unavailable:
461-
case AvailableVersionComparison::Obsoleted:
462-
conditional = AvAttr;
463-
break;
464-
}
465-
}
466-
467-
if (conditional)
468-
return conditional;
469-
return potential;
470-
}
471-
472430
const AvailableAttr *
473431
DeclAttributes::getUnavailable(const ASTContext &ctx,
474432
bool ignoreAppExtensions) const {

lib/AST/Availability.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ AvailabilityRange AvailabilityRange::forRuntimeTarget(const ASTContext &Ctx) {
6565
return AvailabilityRange(VersionRange::allGTE(Ctx.LangOpts.RuntimeVersion));
6666
}
6767

68+
PlatformKind AvailabilityConstraint::getPlatform() const {
69+
return attr->Platform;
70+
}
71+
6872
std::optional<AvailabilityRange>
6973
AvailabilityConstraint::getRequiredNewerAvailabilityRange(
7074
ASTContext &ctx) const {
@@ -89,6 +93,15 @@ bool AvailabilityConstraint::isConditionallySatisfiable() const {
8993
}
9094
}
9195

96+
bool AvailabilityConstraint::isActiveForRuntimeQueries(ASTContext &ctx) const {
97+
if (attr->Platform == PlatformKind::none)
98+
return true;
99+
100+
return swift::isPlatformActive(attr->Platform, ctx.LangOpts,
101+
/*forTargetVariant=*/false,
102+
/*forRuntimeQuery=*/true);
103+
}
104+
92105
namespace {
93106

94107
/// The inferred availability required to access a group of declarations

lib/Sema/DerivedConformanceRawRepresentable.cpp

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -237,38 +237,35 @@ struct RuntimeVersionCheck {
237237
/// information about the runtime check needed to ensure it is available to
238238
/// \c versionCheck and returns true.
239239
static bool
240-
checkAvailability(const EnumElementDecl *elt, ASTContext &C,
240+
checkAvailability(const EnumElementDecl *elt, DeclContext *dc,
241+
AvailabilityContext availabilityContext,
241242
std::optional<RuntimeVersionCheck> &versionCheck) {
242-
auto *attr = elt->getAttrs().getPotentiallyUnavailable(C);
243+
auto &C = dc->getASTContext();
244+
auto constraint =
245+
getUnsatisfiedAvailabilityConstraint(elt, dc, availabilityContext);
243246

244247
// Is it always available?
245-
if (!attr)
248+
if (!constraint)
246249
return true;
247250

248-
// For type-checking purposes, iOS availability is inherited for visionOS
249-
// targets. However, it is not inherited for the sake of code-generation
250-
// of runtime availability queries, and is assumed to be available.
251-
if ((attr->Platform == PlatformKind::iOS ||
252-
attr->Platform == PlatformKind::iOSApplicationExtension) &&
253-
C.LangOpts.Target.isXROS())
251+
// Some constraints are active for type checking but can't translate to
252+
// runtime restrictions.
253+
if (!constraint->isActiveForRuntimeQueries(C))
254254
return true;
255255

256-
AvailableVersionComparison availability = attr->getVersionAvailability(C);
257-
258-
assert(availability != AvailableVersionComparison::Available &&
259-
"DeclAttributes::getPotentiallyUnavailable() shouldn't "
260-
"return an available attribute");
261-
262256
// Is it never available?
263-
if (availability != AvailableVersionComparison::PotentiallyUnavailable)
257+
if (!constraint->isConditionallySatisfiable())
264258
return false;
265259

266260
// It's conditionally available; create a version constraint and return true.
267-
assert(attr->getPlatformAgnosticAvailability() ==
268-
PlatformAgnosticAvailabilityKind::None &&
269-
"can only express #available(somePlatform version) checks");
270-
versionCheck.emplace(attr->Platform, *attr->Introduced);
261+
auto platform = constraint->getPlatform();
262+
auto range = constraint->getRequiredNewerAvailabilityRange(C);
263+
264+
// Only platform version constraints are supported currently.
265+
ASSERT(platform != PlatformKind::none);
266+
ASSERT(range);
271267

268+
versionCheck.emplace(platform, range->getRawMinimumVersion());
272269
return true;
273270
}
274271

@@ -295,6 +292,7 @@ deriveBodyRawRepresentable_init(AbstractFunctionDecl *initDecl, void *) {
295292

296293
auto parentDC = initDecl->getDeclContext();
297294
ASTContext &C = parentDC->getASTContext();
295+
auto availabilityContext = AvailabilityContext::forDeploymentTarget(C);
298296

299297
auto nominalTypeDecl = parentDC->getSelfNominalTypeDecl();
300298
auto enumDecl = cast<EnumDecl>(nominalTypeDecl);
@@ -318,7 +316,7 @@ deriveBodyRawRepresentable_init(AbstractFunctionDecl *initDecl, void *) {
318316
// information about that check in versionCheck and keep processing this
319317
// element.
320318
std::optional<RuntimeVersionCheck> versionCheck(std::nullopt);
321-
if (!checkAvailability(elt, C, versionCheck))
319+
if (!checkAvailability(elt, parentDC, availabilityContext, versionCheck))
322320
continue;
323321

324322
// litPat = elt.rawValueExpr as a pattern

0 commit comments

Comments
 (0)