Skip to content

Commit 70a2363

Browse files
committed
AST: Introduce new conveniences for synthesizing AvailabilityAttrs.
This makes intent clearer at the call site and removes a lot of explicit uses of PlatformAgnosticAvailabilityKind, which is going away.
1 parent c12e0a1 commit 70a2363

File tree

6 files changed

+125
-95
lines changed

6 files changed

+125
-95
lines changed

include/swift/AST/Attr.h

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -813,14 +813,36 @@ class AvailableAttr : public DeclAttribute {
813813
Bits.AvailableAttr.PlatformAgnostic);
814814
}
815815

816-
/// Create an AvailableAttr that indicates specific availability
817-
/// for all platforms.
818-
static AvailableAttr *
819-
createPlatformAgnostic(ASTContext &C, StringRef Message, StringRef Rename = "",
820-
PlatformAgnosticAvailabilityKind Reason
821-
= PlatformAgnosticAvailabilityKind::Unavailable,
822-
llvm::VersionTuple Obsoleted
823-
= llvm::VersionTuple());
816+
/// Create an `AvailableAttr` that specifies universal unavailability, e.g.
817+
/// `@available(*, unavailable)`.
818+
static AvailableAttr *createUniversallyUnavailable(ASTContext &C,
819+
StringRef Message,
820+
StringRef Rename = "");
821+
822+
/// Create an `AvailableAttr` that specifies universal deprecation, e.g.
823+
/// `@available(*, deprecated)`.
824+
static AvailableAttr *createUniversallyDeprecated(ASTContext &C,
825+
StringRef Message,
826+
StringRef Rename = "");
827+
828+
/// Create an `AvailableAttr` that specifies unavailability in Swift, e.g.
829+
/// `@available(swift, unavailable)`.
830+
static AvailableAttr *createUnavailableInSwift(ASTContext &C,
831+
StringRef Message,
832+
StringRef Rename = "");
833+
834+
/// Create an `AvailableAttr` that specifies availability associated with
835+
/// Swift language modes, e.g. `@available(swift, obsoleted: 6)`.
836+
static AvailableAttr *createSwiftLanguageModeVersioned(
837+
ASTContext &C, StringRef Message, StringRef Rename,
838+
llvm::VersionTuple Introduced, llvm::VersionTuple Obsoleted);
839+
840+
/// Create an `AvailableAttr` that specifies versioned availability for a
841+
/// particular platform, e.g. `@available(macOS, introduced: 13)`.
842+
static AvailableAttr *createPlatformVersioned(
843+
ASTContext &C, PlatformKind Platform, StringRef Message, StringRef Rename,
844+
llvm::VersionTuple Introduced, llvm::VersionTuple Deprecated,
845+
llvm::VersionTuple Obsoleted);
824846

825847
AvailableAttr *clone(ASTContext &C, bool implicit) const;
826848
AvailableAttr *clone(ASTContext &C) const {

lib/AST/Attr.cpp

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,24 +2134,62 @@ AvailableAttr::AvailableAttr(
21342134

21352135
#undef INIT_VER_TUPLE
21362136

2137-
AvailableAttr *
2138-
AvailableAttr::createPlatformAgnostic(ASTContext &C,
2139-
StringRef Message,
2140-
StringRef Rename,
2141-
PlatformAgnosticAvailabilityKind Kind,
2142-
llvm::VersionTuple Obsoleted) {
2143-
assert(Kind != PlatformAgnosticAvailabilityKind::None);
2144-
llvm::VersionTuple NoVersion;
2145-
if (Kind == PlatformAgnosticAvailabilityKind::SwiftVersionSpecific) {
2146-
assert(!Obsoleted.empty());
2147-
}
2137+
AvailableAttr *AvailableAttr::createUniversallyUnavailable(ASTContext &C,
2138+
StringRef Message,
2139+
StringRef Rename) {
2140+
return new (C) AvailableAttr(
2141+
SourceLoc(), SourceRange(), PlatformKind::none, Message, Rename,
2142+
/*Introduced=*/{}, SourceRange(), /*Deprecated=*/{}, SourceRange(),
2143+
/*Obsoleted=*/{}, SourceRange(),
2144+
PlatformAgnosticAvailabilityKind::Unavailable, /*Implicit=*/false,
2145+
/*SPI=*/false);
2146+
}
2147+
2148+
AvailableAttr *AvailableAttr::createUniversallyDeprecated(ASTContext &C,
2149+
StringRef Message,
2150+
StringRef Rename) {
2151+
return new (C) AvailableAttr(
2152+
SourceLoc(), SourceRange(), PlatformKind::none, Message, Rename,
2153+
/*Introduced=*/{}, SourceRange(), /*Deprecated=*/{}, SourceRange(),
2154+
/*Obsoleted=*/{}, SourceRange(),
2155+
PlatformAgnosticAvailabilityKind::Deprecated, /*Implicit=*/false,
2156+
/*SPI=*/false);
2157+
}
2158+
2159+
AvailableAttr *AvailableAttr::createUnavailableInSwift(ASTContext &C,
2160+
StringRef Message,
2161+
StringRef Rename) {
21482162
return new (C) AvailableAttr(
21492163
SourceLoc(), SourceRange(), PlatformKind::none, Message, Rename,
2150-
/*Introduced=*/NoVersion, SourceRange(), /*Deprecated=*/NoVersion,
2151-
SourceRange(), Obsoleted, SourceRange(), Kind, /*Implicit=*/false,
2164+
/*Introduced=*/{}, SourceRange(), /*Deprecated=*/{}, SourceRange(),
2165+
/*Obsoleted=*/{}, SourceRange(),
2166+
PlatformAgnosticAvailabilityKind::UnavailableInSwift, /*Implicit=*/false,
21522167
/*SPI=*/false);
21532168
}
21542169

2170+
AvailableAttr *AvailableAttr::createSwiftLanguageModeVersioned(
2171+
ASTContext &C, StringRef Message, StringRef Rename,
2172+
llvm::VersionTuple Introduced, llvm::VersionTuple Obsoleted) {
2173+
return new (C) AvailableAttr(
2174+
SourceLoc(), SourceRange(), PlatformKind::none, Message, Rename,
2175+
Introduced, SourceRange(), /*Deprecated=*/{}, SourceRange(), Obsoleted,
2176+
SourceRange(), PlatformAgnosticAvailabilityKind::SwiftVersionSpecific,
2177+
/*Implicit=*/false,
2178+
/*SPI=*/false);
2179+
}
2180+
2181+
AvailableAttr *AvailableAttr::createPlatformVersioned(
2182+
ASTContext &C, PlatformKind Platform, StringRef Message, StringRef Rename,
2183+
llvm::VersionTuple Introduced, llvm::VersionTuple Deprecated,
2184+
llvm::VersionTuple Obsoleted) {
2185+
return new (C) AvailableAttr(SourceLoc(), SourceRange(), Platform, Message,
2186+
Rename, Introduced, SourceRange(), Deprecated,
2187+
SourceRange(), Obsoleted, SourceRange(),
2188+
PlatformAgnosticAvailabilityKind::None,
2189+
/*Implicit=*/false,
2190+
/*SPI=*/false);
2191+
}
2192+
21552193
bool BackDeployedAttr::isActivePlatform(const ASTContext &ctx,
21562194
bool forTargetVariant) const {
21572195
return isPlatformActive(Platform, ctx.LangOpts, forTargetVariant);

lib/ClangImporter/ClangDerivedConformances.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1269,7 +1269,8 @@ void swift::conformToCxxSpanIfNeeded(ClangImporter::Implementation &impl,
12691269
if (!importedConstructor)
12701270
return;
12711271

1272-
auto attr = AvailableAttr::createPlatformAgnostic(importedConstructor->getASTContext(), "use 'init(_:)' instead.", "", PlatformAgnosticAvailabilityKind::Deprecated);
1272+
auto attr = AvailableAttr::createUniversallyDeprecated(
1273+
importedConstructor->getASTContext(), "use 'init(_:)' instead.", "");
12731274
importedConstructor->getAttrs().add(attr);
12741275

12751276
decl->addMember(importedConstructor);

lib/ClangImporter/ImportDecl.cpp

Lines changed: 38 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -554,18 +554,9 @@ static void applyAvailableAttribute(Decl *decl, AvailabilityRange &info,
554554
if (info.isAlwaysAvailable())
555555
return;
556556

557-
llvm::VersionTuple noVersion;
558-
auto AvAttr = new (C) AvailableAttr(
559-
SourceLoc(), SourceRange(), targetPlatform(C.LangOpts),
560-
/*Message=*/StringRef(),
561-
/*Rename=*/StringRef(), info.getRawMinimumVersion(),
562-
/*IntroducedRange=*/SourceRange(),
563-
/*Deprecated=*/noVersion,
564-
/*DeprecatedRange=*/SourceRange(),
565-
/*Obsoleted=*/noVersion,
566-
/*ObsoletedRange=*/SourceRange(), PlatformAgnosticAvailabilityKind::None,
567-
/*Implicit=*/false,
568-
/*SPI=*/false);
557+
auto AvAttr = AvailableAttr::createPlatformVersioned(
558+
C, targetPlatform(C.LangOpts), /*Message=*/"", /*Rename=*/"",
559+
info.getRawMinimumVersion(), /*Deprecated=*/{}, /*Obsoleted=*/{});
569560

570561
decl->getAttrs().add(AvAttr);
571562
}
@@ -1304,9 +1295,8 @@ namespace {
13041295
// "Raw" is the Objective-C name, which was never available in Swift.
13051296
// Variants within the active version are usually declarations that
13061297
// have been superseded, like the accessors of a property.
1307-
attr = AvailableAttr::createPlatformAgnostic(
1308-
ctx, /*Message*/StringRef(), ctx.AllocateCopy(renamed.str()),
1309-
PlatformAgnosticAvailabilityKind::UnavailableInSwift);
1298+
attr = AvailableAttr::createUnavailableInSwift(
1299+
ctx, /*Message*/ StringRef(), ctx.AllocateCopy(renamed.str()));
13101300
} else {
13111301
unsigned majorVersion = getVersion().majorVersionNumber();
13121302
unsigned minorVersion = getVersion().minorVersionNumber();
@@ -1319,26 +1309,19 @@ namespace {
13191309
(majorVersion == 4 && minorVersion < 2)
13201310
? llvm::VersionTuple(4, 2)
13211311
: llvm::VersionTuple(majorVersion + 1);
1322-
attr = AvailableAttr::createPlatformAgnostic(
1323-
ctx, /*Message*/StringRef(), ctx.AllocateCopy(renamed.str()),
1324-
PlatformAgnosticAvailabilityKind::SwiftVersionSpecific,
1325-
obsoletedVersion);
1312+
attr = AvailableAttr::createSwiftLanguageModeVersioned(
1313+
ctx, /*Message=*/"", ctx.AllocateCopy(renamed.str()),
1314+
/*Introduced=*/{}, obsoletedVersion);
13261315
} else {
13271316
// Future names are introduced in their future version.
13281317
assert(getVersion() > getActiveSwiftVersion());
13291318
llvm::VersionTuple introducedVersion =
13301319
(majorVersion == 4 && minorVersion == 2)
13311320
? llvm::VersionTuple(4, 2)
13321321
: llvm::VersionTuple(majorVersion);
1333-
attr = new (ctx) AvailableAttr(
1334-
SourceLoc(), SourceRange(), PlatformKind::none,
1335-
/*Message=*/StringRef(), ctx.AllocateCopy(renamed.str()),
1336-
/*Introduced=*/introducedVersion, SourceRange(),
1337-
/*Deprecated=*/llvm::VersionTuple(), SourceRange(),
1338-
/*Obsoleted=*/llvm::VersionTuple(), SourceRange(),
1339-
PlatformAgnosticAvailabilityKind::SwiftVersionSpecific,
1340-
/*Implicit=*/false,
1341-
/*SPI=*/false);
1322+
attr = AvailableAttr::createSwiftLanguageModeVersioned(
1323+
ctx, /*Message=*/"", ctx.AllocateCopy(renamed.str()),
1324+
introducedVersion, /*Obsoleted=*/{});
13421325
}
13431326
}
13441327

@@ -1525,10 +1508,8 @@ namespace {
15251508

15261509
// Make Objective-C's 'id' unavailable.
15271510
if (Impl.SwiftContext.LangOpts.EnableObjCInterop && isObjCId(Decl)) {
1528-
auto attr = AvailableAttr::createPlatformAgnostic(
1529-
Impl.SwiftContext,
1530-
"'id' is not available in Swift; use 'Any'", "",
1531-
PlatformAgnosticAvailabilityKind::UnavailableInSwift);
1511+
auto attr = AvailableAttr::createUnavailableInSwift(
1512+
Impl.SwiftContext, "'id' is not available in Swift; use 'Any'", "");
15321513
Result->getAttrs().add(attr);
15331514
}
15341515

@@ -2391,12 +2372,12 @@ namespace {
23912372
synthesizer.createDefaultConstructor(result);
23922373
ctors.push_back(defaultCtor);
23932374
if (cxxRecordDecl) {
2394-
auto attr = AvailableAttr::createPlatformAgnostic(
2375+
auto attr = AvailableAttr::createUniversallyDeprecated(
23952376
defaultCtor->getASTContext(),
23962377
"This zero-initializes the backing memory of the struct, which "
23972378
"is unsafe for some C++ structs. Consider adding an explicit "
23982379
"default initializer for this C++ struct.",
2399-
"", PlatformAgnosticAvailabilityKind::Deprecated);
2380+
"");
24002381
defaultCtor->getAttrs().add(attr);
24012382
}
24022383
}
@@ -2910,16 +2891,11 @@ namespace {
29102891
auto availability = Impl.SwiftContext.getSwift58Availability();
29112892
if (!availability.isAlwaysAvailable()) {
29122893
assert(availability.hasMinimumVersion());
2913-
auto AvAttr = new (Impl.SwiftContext)
2914-
AvailableAttr(SourceLoc(), SourceRange(),
2915-
targetPlatform(Impl.SwiftContext.LangOpts),
2916-
/*Message=*/"", /*Rename=*/"",
2917-
availability.getRawMinimumVersion(),
2918-
/*IntroducedRange=*/SourceRange(), {},
2919-
/*DeprecatedRange=*/SourceRange(), {},
2920-
/*ObsoletedRange=*/SourceRange(),
2921-
PlatformAgnosticAvailabilityKind::None,
2922-
/*Implicit=*/false, false);
2894+
auto AvAttr = AvailableAttr::createPlatformVersioned(
2895+
Impl.SwiftContext, targetPlatform(Impl.SwiftContext.LangOpts),
2896+
/*Message=*/"", /*Rename=*/"",
2897+
availability.getRawMinimumVersion(), /*Deprecated=*/{},
2898+
/*Obsoleted=*/{});
29232899
classDecl->getAttrs().add(AvAttr);
29242900
}
29252901
}
@@ -4419,7 +4395,7 @@ namespace {
44194395
decl, AccessLevel::Public, loc, name, loc, std::nullopt,
44204396
genericParamList, dc);
44214397

4422-
auto attr = AvailableAttr::createPlatformAgnostic(
4398+
auto attr = AvailableAttr::createUniversallyUnavailable(
44234399
Impl.SwiftContext, "Un-specialized class templates are not currently "
44244400
"supported. Please use a specialization of this "
44254401
"type.");
@@ -5389,8 +5365,8 @@ namespace {
53895365
message = "cannot find Swift declaration for this protocol";
53905366
else
53915367
llvm_unreachable("unknown bridged decl kind");
5392-
auto attr = AvailableAttr::createPlatformAgnostic(Impl.SwiftContext,
5393-
message);
5368+
auto attr = AvailableAttr::createUniversallyUnavailable(Impl.SwiftContext,
5369+
message);
53945370
VD->getAttrs().add(attr);
53955371
}
53965372

@@ -5443,7 +5419,7 @@ namespace {
54435419
addObjCAttribute(result,
54445420
Impl.importIdentifier(decl->getIdentifier()));
54455421
result->setImplicit();
5446-
auto attr = AvailableAttr::createPlatformAgnostic(
5422+
auto attr = AvailableAttr::createUniversallyUnavailable(
54475423
Impl.SwiftContext,
54485424
"This Objective-C protocol has only been forward-declared; "
54495425
"import its owning module to use it");
@@ -5598,7 +5574,8 @@ namespace {
55985574
auto result = createFakeClass(name, /* cacheResult */ true,
55995575
/* inheritFromNSObject */ true);
56005576
result->setImplicit();
5601-
auto attr = AvailableAttr::createPlatformAgnostic(Impl.SwiftContext,
5577+
auto attr = AvailableAttr::createUniversallyUnavailable(
5578+
Impl.SwiftContext,
56025579
"This Objective-C class has only been forward-declared; "
56035580
"import its owning module to use it");
56045581
result->getAttrs().add(attr);
@@ -6490,7 +6467,7 @@ SwiftDeclConverter::importOptionConstant(const clang::EnumConstantDecl *decl,
64906467
!CD->isUnavailable()) {
64916468
/// Create an AvailableAttr that indicates specific availability
64926469
/// for all platforms.
6493-
auto attr = AvailableAttr::createPlatformAgnostic(
6470+
auto attr = AvailableAttr::createUniversallyUnavailable(
64946471
Impl.SwiftContext, "use [] to construct an empty option set");
64956472
CD->getAttrs().add(attr);
64966473
}
@@ -7127,7 +7104,7 @@ ConstructorDecl *SwiftDeclConverter::importConstructor(
71277104
errorStr += objcMethod->getSelector().getAsString();
71287105
errorStr += ']';
71297106

7130-
auto attr = AvailableAttr::createPlatformAgnostic(
7107+
auto attr = AvailableAttr::createUniversallyUnavailable(
71317108
Impl.SwiftContext, Impl.SwiftContext.AllocateCopy(errorStr.str()));
71327109
ctor->getAttrs().add(attr);
71337110
continue;
@@ -8808,7 +8785,7 @@ void ClangImporter::Implementation::importAttributes(
88088785
//
88098786
if (auto unavailable = dyn_cast<clang::UnavailableAttr>(*AI)) {
88108787
auto Message = unavailable->getMessage();
8811-
auto attr = AvailableAttr::createPlatformAgnostic(C, Message);
8788+
auto attr = AvailableAttr::createUniversallyUnavailable(C, Message);
88128789
MappedDecl->getAttrs().add(attr);
88138790
AnyUnavailable = true;
88148791
continue;
@@ -8821,8 +8798,7 @@ void ClangImporter::Implementation::importAttributes(
88218798
//
88228799
if (auto unavailable_annot = dyn_cast<clang::AnnotateAttr>(*AI))
88238800
if (unavailable_annot->getAnnotation() == "swift1_unavailable") {
8824-
auto attr = AvailableAttr::createPlatformAgnostic(
8825-
C, "", "", PlatformAgnosticAvailabilityKind::UnavailableInSwift);
8801+
auto attr = AvailableAttr::createUnavailableInSwift(C, "", "");
88268802
MappedDecl->getAttrs().add(attr);
88278803
AnyUnavailable = true;
88288804
continue;
@@ -8835,8 +8811,7 @@ void ClangImporter::Implementation::importAttributes(
88358811
//
88368812
if (auto deprecated = dyn_cast<clang::DeprecatedAttr>(*AI)) {
88378813
auto Message = deprecated->getMessage();
8838-
auto attr = AvailableAttr::createPlatformAgnostic(C, Message, "",
8839-
PlatformAgnosticAvailabilityKind::Deprecated);
8814+
auto attr = AvailableAttr::createUniversallyDeprecated(C, Message, "");
88408815
MappedDecl->getAttrs().add(attr);
88418816
continue;
88428817
}
@@ -8858,9 +8833,8 @@ void ClangImporter::Implementation::importAttributes(
88588833
if (!replacement.empty())
88598834
swiftReplacement = getSwiftNameFromClangName(replacement);
88608835

8861-
auto attr = AvailableAttr::createPlatformAgnostic(
8862-
C, avail->getMessage(), swiftReplacement,
8863-
PlatformAgnosticAvailabilityKind::UnavailableInSwift);
8836+
auto attr = AvailableAttr::createUnavailableInSwift(
8837+
C, avail->getMessage(), swiftReplacement);
88648838
MappedDecl->getAttrs().add(attr);
88658839
AnyUnavailable = true;
88668840
continue;
@@ -8968,7 +8942,7 @@ void ClangImporter::Implementation::importAttributes(
89688942
if (auto ID = dyn_cast<clang::ObjCInterfaceDecl>(ClangDecl)) {
89698943
// Ban NSInvocation.
89708944
if (ID->getName() == "NSInvocation") {
8971-
auto attr = AvailableAttr::createPlatformAgnostic(C, "");
8945+
auto attr = AvailableAttr::createUniversallyUnavailable(C, "");
89728946
MappedDecl->getAttrs().add(attr);
89738947
return;
89748948
}
@@ -9001,8 +8975,8 @@ void ClangImporter::Implementation::importAttributes(
90018975
!FD->getAttr<clang::SwiftNameAttr>()) {
90028976
if (auto t = FD->getParamDecl(0)->getType()->getAs<clang::TypedefType>()){
90038977
if (isCFTypeDecl(t->getDecl())) {
9004-
auto attr = AvailableAttr::createPlatformAgnostic(C,
9005-
"Core Foundation objects are automatically memory managed");
8978+
auto attr = AvailableAttr::createUniversallyUnavailable(
8979+
C, "Core Foundation objects are automatically memory managed");
90068980
MappedDecl->getAttrs().add(attr);
90078981
return;
90088982
}
@@ -9690,8 +9664,8 @@ void ClangImporter::Implementation::
96909664
markUnavailable(ValueDecl *decl, StringRef unavailabilityMsgRef) {
96919665

96929666
unavailabilityMsgRef = SwiftContext.AllocateCopy(unavailabilityMsgRef);
9693-
auto ua = AvailableAttr::createPlatformAgnostic(SwiftContext,
9694-
unavailabilityMsgRef);
9667+
auto ua = AvailableAttr::createUniversallyUnavailable(SwiftContext,
9668+
unavailabilityMsgRef);
96959669
decl->getAttrs().add(ua);
96969670
}
96979671

lib/Sema/TypeCheckConcurrency.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6672,13 +6672,8 @@ static void addUnavailableAttrs(ExtensionDecl *ext, NominalTypeDecl *nominal) {
66726672

66736673
// Add the blanket "unavailable".
66746674

6675-
auto attr = new (ctx) AvailableAttr(
6676-
SourceLoc(), SourceRange(), PlatformKind::none, /*Message*/ "",
6677-
/*Rename=*/"", /*Introduced=*/noVersion, SourceRange(),
6678-
/*Deprecated=*/noVersion, SourceRange(), /*Obsoleted=*/noVersion,
6679-
SourceRange(), PlatformAgnosticAvailabilityKind::Unavailable,
6680-
/*Implicit=*/false, /*SPI=*/false);
6681-
ext->getAttrs().add(attr);
6675+
ext->getAttrs().add(
6676+
AvailableAttr::createUniversallyUnavailable(ctx, /*Message=*/""));
66826677
}
66836678

66846679
ProtocolConformance *swift::deriveImplicitSendableConformance(

0 commit comments

Comments
 (0)