Skip to content

Commit 94cbda5

Browse files
committed
[ASTGen] Generate miscellaneous availability related nodes
* `@_specialize` with `availability:` arguments * `@backDeployed` attributes * `@_originallyDefinedIn` attributes * `#available()` and `#unavailable()` statement conditions
1 parent 8d69807 commit 94cbda5

File tree

12 files changed

+335
-53
lines changed

12 files changed

+335
-53
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ enum class MacroRole : uint32_t;
5151
class MacroIntroducedDeclName;
5252
enum class MacroIntroducedDeclNameKind;
5353
enum class ParamSpecifier : uint8_t;
54+
enum class PlatformKind : uint8_t;
5455
class ProtocolConformanceRef;
5556
class RegexLiteralPatternFeature;
5657
class RegexLiteralPatternFeatureKind;
@@ -589,6 +590,8 @@ enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedPlatformKind : size_t {
589590
SWIFT_NAME("BridgedPlatformKind.init(from:)")
590591
BridgedPlatformKind BridgedPlatformKind_fromString(BridgedStringRef cStr);
591592

593+
swift::PlatformKind unbridge(BridgedPlatformKind cPlatform);
594+
592595
SWIFT_NAME("BridgedAvailabilityMacroMap.has(self:name:)")
593596
bool BridgedAvailabilityMacroMap_hasName(BridgedAvailabilityMacroMap map,
594597
BridgedStringRef name);
@@ -627,6 +630,10 @@ SWIFT_NAME("getter:BridgedAvailabilitySpec.domain(self:)")
627630
BridgedAvailabilityDomain
628631
BridgedAvailabilitySpec_getDomain(BridgedAvailabilitySpec spec);
629632

633+
SWIFT_NAME("getter:BridgedAvailabilitySpec.platform(self:)")
634+
BridgedPlatformKind
635+
BridgedAvailabilitySpec_getPlatform(BridgedAvailabilitySpec spec);
636+
630637
SWIFT_NAME("getter:BridgedAvailabilitySpec.version(self:)")
631638
BridgedVersionTuple
632639
BridgedAvailabilitySpec_getVersion(BridgedAvailabilitySpec spec);
@@ -802,6 +809,13 @@ BridgedAllowFeatureSuppressionAttr_createParsed(
802809
bool inverted,
803810
BridgedArrayRef cFeatures);
804811

812+
SWIFT_NAME(
813+
"BridgedBackDeployedAttr.createParsed(_:atLoc:range:platform:version:)")
814+
BridgedBackDeployedAttr BridgedBackDeployedAttr_createParsed(
815+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
816+
BridgedSourceRange cRange, BridgedPlatformKind cPlatform,
817+
BridgedVersionTuple cVersion);
818+
805819
SWIFT_NAME("BridgedCDeclAttr.createParsed(_:atLoc:range:name:)")
806820
BridgedCDeclAttr BridgedCDeclAttr_createParsed(BridgedASTContext cContext,
807821
BridgedSourceLoc cAtLoc,
@@ -949,6 +963,13 @@ BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed(
949963
BridgedSourceLoc cLParenLoc, BridgedMacroRole cRole, BridgedArrayRef cNames,
950964
BridgedArrayRef cConformances, BridgedSourceLoc cRParenLoc);
951965

966+
SWIFT_NAME("BridgedOriginallyDefinedInAttr.createParsed(_:atLoc:range:"
967+
"moduleName:platform:version:)")
968+
BridgedOriginallyDefinedInAttr BridgedOriginallyDefinedInAttr_createParsed(
969+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
970+
BridgedSourceRange cRange, BridgedStringRef cModuleName,
971+
BridgedPlatformKind cPlatform, BridgedVersionTuple cVersion);
972+
952973
SWIFT_NAME("BridgedStorageRestrictionsAttr.createParsed(_:atLoc:range:"
953974
"initializes:accesses:)")
954975
BridgedStorageRestrictionsAttr BridgedStorageRestrictionsAttr_createParsed(
@@ -1949,6 +1970,17 @@ BridgedStmtConditionElement BridgedStmtConditionElement_createPatternBinding(
19491970
BridgedASTContext cContext, BridgedSourceLoc cIntroducerLoc,
19501971
BridgedPattern cPattern, BridgedExpr cInitializer);
19511972

1973+
SWIFT_NAME("BridgedStmtConditionElement.createPoundAvailable(info:)")
1974+
BridgedStmtConditionElement BridgedStmtConditionElement_createPoundAvailable(
1975+
BridgedPoundAvailableInfo info);
1976+
1977+
SWIFT_NAME("BridgedPoundAvailableInfo.createParsed(_:poundLoc:lParenLoc:specs:"
1978+
"rParenLoc:isUnavailable:)")
1979+
BridgedPoundAvailableInfo BridgedPoundAvailableInfo_createParsed(
1980+
BridgedASTContext cContext, BridgedSourceLoc cPoundLoc,
1981+
BridgedSourceLoc cLParenLoc, BridgedArrayRef cSpecs,
1982+
BridgedSourceLoc cRParenLoc, bool isUnavailability);
1983+
19521984
struct BridgedCaseLabelItemInfo {
19531985
SWIFT_NAME("isDefault")
19541986
bool IsDefault;

include/swift/AST/ASTBridgingWrappers.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ AST_BRIDGING_WRAPPER_NULLABLE(PlatformVersionConstraintAvailabilitySpec)
111111
AST_BRIDGING_WRAPPER_NULLABLE(PlatformAgnosticVersionConstraintAvailabilitySpec)
112112
AST_BRIDGING_WRAPPER_NULLABLE(OtherPlatformAvailabilitySpec)
113113
AST_BRIDGING_WRAPPER_CONST_NONNULL(AvailabilityMacroMap)
114+
AST_BRIDGING_WRAPPER_NONNULL(PoundAvailableInfo)
114115

115116
// Non-AST types to generate wrappers for.
116117
AST_BRIDGING_WRAPPER_NULLABLE(DiagnosticEngine)

include/swift/AST/AvailabilitySpec.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ class AvailabilitySpec : public ASTAllocated<AvailabilitySpec> {
6060

6161
std::optional<AvailabilityDomain> getDomain() const;
6262

63+
std::optional<PlatformKind> getPlatform() const;
64+
6365
llvm::VersionTuple getVersion() const;
6466

6567
SourceRange getVersionSrcRange() const;

lib/AST/AvailabilitySpec.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,20 @@ std::optional<AvailabilityDomain> AvailabilitySpec::getDomain() const {
5252
llvm_unreachable("bad AvailabilitySpecKind");
5353
}
5454

55+
std::optional<PlatformKind> AvailabilitySpec::getPlatform() const {
56+
switch (getKind()) {
57+
case AvailabilitySpecKind::PlatformVersionConstraint: {
58+
auto spec = cast<PlatformVersionConstraintAvailabilitySpec>(this);
59+
return spec->getPlatform();
60+
}
61+
case AvailabilitySpecKind::LanguageVersionConstraint:
62+
case AvailabilitySpecKind::PackageDescriptionVersionConstraint:
63+
case AvailabilitySpecKind::OtherPlatform:
64+
return std::nullopt;
65+
}
66+
llvm_unreachable("bad AvailabilitySpecKind");
67+
}
68+
5569
llvm::VersionTuple AvailabilitySpec::getVersion() const {
5670
switch (getKind()) {
5771
case AvailabilitySpecKind::PlatformVersionConstraint: {

lib/AST/Bridging/AvailabilityBridging.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ BridgedPlatformKind BridgedPlatformKind_fromString(BridgedStringRef cStr) {
5858
}
5959
}
6060

61-
static PlatformKind unbridge(BridgedPlatformKind platform) {
61+
PlatformKind unbridge(BridgedPlatformKind platform) {
6262
switch (platform) {
6363
case BridgedPlatformKind_None:
6464
return PlatformKind::none;
@@ -70,6 +70,18 @@ static PlatformKind unbridge(BridgedPlatformKind platform) {
7070
llvm_unreachable("unhandled enum value");
7171
}
7272

73+
static BridgedPlatformKind bridge(PlatformKind platform) {
74+
switch (platform) {
75+
case PlatformKind::none:
76+
return BridgedPlatformKind_None;
77+
#define AVAILABILITY_PLATFORM(X, PrettyName) \
78+
case PlatformKind::X: \
79+
return BridgedPlatformKind_##X;
80+
#include "swift/AST/PlatformKinds.def"
81+
}
82+
llvm_unreachable("unhandled enum value");
83+
}
84+
7385
//===----------------------------------------------------------------------===//
7486
// MARK: AvailabilitySpec
7587
//===----------------------------------------------------------------------===//
@@ -87,6 +99,14 @@ BridgedAvailabilitySpec_getDomain(BridgedAvailabilitySpec spec) {
8799
return BridgedAvailabilityDomain();
88100
}
89101

102+
BridgedPlatformKind
103+
BridgedAvailabilitySpec_getPlatform(BridgedAvailabilitySpec spec) {
104+
auto platform = spec.unbridged()->getPlatform();
105+
if (platform)
106+
return bridge(*platform);
107+
return BridgedPlatformKind_None;
108+
}
109+
90110
BridgedVersionTuple
91111
BridgedAvailabilitySpec_getVersion(BridgedAvailabilitySpec spec) {
92112
return spec.unbridged()->getVersion();

lib/AST/Bridging/DeclAttributeBridging.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,17 @@ BridgedAllowFeatureSuppressionAttr_createParsed(BridgedASTContext cContext,
185185
/*implicit*/ false, inverted, features);
186186
}
187187

188+
SWIFT_NAME(
189+
"BridgedBackDeployedAttr.createParsed(_:atLoc:range:platform:version:)")
190+
BridgedBackDeployedAttr BridgedBackDeployedAttr_createParsed(
191+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
192+
BridgedSourceRange cRange, BridgedPlatformKind cPlatform,
193+
BridgedVersionTuple cVersion) {
194+
return new (cContext.unbridged()) BackDeployedAttr(
195+
cAtLoc.unbridged(), cRange.unbridged(), unbridge(cPlatform),
196+
cVersion.unbridged(), /*Implicit=*/false);
197+
}
198+
188199
BridgedCDeclAttr BridgedCDeclAttr_createParsed(BridgedASTContext cContext,
189200
BridgedSourceLoc cAtLoc,
190201
BridgedSourceRange cRange,
@@ -388,6 +399,18 @@ BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed(
388399
conformances, cRParenLoc.unbridged(), /*implicit=*/false);
389400
}
390401

402+
SWIFT_NAME("BridgedOriginallyDefinedInAttr.createParsed(_:atLoc:range:"
403+
"moduleName:platform:version:)")
404+
BridgedOriginallyDefinedInAttr BridgedOriginallyDefinedInAttr_createParsed(
405+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
406+
BridgedSourceRange cRange, BridgedStringRef cModuleName,
407+
BridgedPlatformKind cPlatform, BridgedVersionTuple cVersion) {
408+
return new (cContext.unbridged()) OriginallyDefinedInAttr(
409+
cAtLoc.unbridged(), cRange.unbridged(), cModuleName.unbridged(),
410+
unbridge(cPlatform), cVersion.unbridged(),
411+
/*Implicit=*/false);
412+
}
413+
391414
BridgedStorageRestrictionsAttr BridgedStorageRestrictionsAttr_createParsed(
392415
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
393416
BridgedSourceRange cRange, BridgedArrayRef cInitializes,

lib/AST/Bridging/StmtBridging.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,23 @@ BridgedStmtConditionElement BridgedStmtConditionElement_createPatternBinding(
5252
cInitializer.unbridged()));
5353
}
5454

55+
BridgedStmtConditionElement BridgedStmtConditionElement_createPoundAvailable(
56+
BridgedPoundAvailableInfo info) {
57+
return StmtConditionElement(info.unbridged());
58+
}
59+
60+
BridgedPoundAvailableInfo BridgedPoundAvailableInfo_createParsed(
61+
BridgedASTContext cContext, BridgedSourceLoc cPoundLoc,
62+
BridgedSourceLoc cLParenLoc, BridgedArrayRef cSpecs,
63+
BridgedSourceLoc cRParenLoc, bool isUnavailability) {
64+
SmallVector<AvailabilitySpec *, 4> specs;
65+
for (auto cSpec : cSpecs.unbridged<BridgedAvailabilitySpec>())
66+
specs.push_back(cSpec.unbridged());
67+
return PoundAvailableInfo::create(cContext.unbridged(), cPoundLoc.unbridged(),
68+
cLParenLoc.unbridged(), specs,
69+
cRParenLoc.unbridged(), isUnavailability);
70+
}
71+
5572
BridgedBraceStmt BridgedBraceStmt_createParsed(BridgedASTContext cContext,
5673
BridgedSourceLoc cLBLoc,
5774
BridgedArrayRef elements,

0 commit comments

Comments
 (0)