Skip to content

Commit 670084a

Browse files
committed
AST: Retire PlatformVersionConstraintAvailabilitySpec.
1 parent 0722efe commit 670084a

18 files changed

+118
-197
lines changed

include/swift/AST/ASTBridging.h

+7-14
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,13 @@ BridgedAvailabilitySpec BridgedAvailabilitySpec_createPlatformAgnostic(
646646
BridgedSourceLoc cLoc, BridgedVersionTuple cVersion,
647647
BridgedSourceRange cVersionRange);
648648

649+
SWIFT_NAME("BridgedAvailabilitySpec.createPlatformVersioned(_:platform:"
650+
"platformLoc:version:versionRange:)")
651+
BridgedAvailabilitySpec BridgedAvailabilitySpec_createPlatformVersioned(
652+
BridgedASTContext cContext, BridgedPlatformKind cPlatform,
653+
BridgedSourceLoc cPlatformLoc, BridgedVersionTuple cVersion,
654+
BridgedSourceRange cVersionSrcRange);
655+
649656
SWIFT_NAME("getter:BridgedAvailabilitySpec.sourceRange(self:)")
650657
BridgedSourceRange
651658
BridgedAvailabilitySpec_getSourceRange(BridgedAvailabilitySpec spec);
@@ -666,20 +673,6 @@ SWIFT_NAME("getter:BridgedAvailabilitySpec.versionRange(self:)")
666673
BridgedSourceRange
667674
BridgedAvailabilitySpec_getVersionRange(BridgedAvailabilitySpec spec);
668675

669-
SWIFT_NAME("BridgedPlatformVersionConstraintAvailabilitySpec.createParsed(_:"
670-
"platform:platformLoc:version:versionRange:)")
671-
BridgedPlatformVersionConstraintAvailabilitySpec
672-
BridgedPlatformVersionConstraintAvailabilitySpec_createParsed(
673-
BridgedASTContext cContext, BridgedPlatformKind cPlatform,
674-
BridgedSourceLoc cPlatformLoc, BridgedVersionTuple cVersion,
675-
BridgedSourceRange cVersionSrcRange);
676-
677-
SWIFT_NAME("getter:BridgedPlatformVersionConstraintAvailabilitySpec."
678-
"asAvailabilitySpec(self:)")
679-
BridgedAvailabilitySpec
680-
BridgedPlatformVersionConstraintAvailabilitySpec_asAvailabilitySpec(
681-
BridgedPlatformVersionConstraintAvailabilitySpec spec);
682-
683676
struct BridgedAvailabilityDomain {
684677
void *_Nullable opaque;
685678

include/swift/AST/ASTBridgingWrappers.def

-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ AST_BRIDGING_WRAPPER_NONNULL(TypeAttributes)
107107
AST_BRIDGING_WRAPPER_NONNULL(CustomAttribute)
108108
AST_BRIDGING_WRAPPER_NULLABLE(ArgumentList)
109109
AST_BRIDGING_WRAPPER_NULLABLE(AvailabilitySpec)
110-
AST_BRIDGING_WRAPPER_NULLABLE(PlatformVersionConstraintAvailabilitySpec)
111110
AST_BRIDGING_WRAPPER_CONST_NONNULL(AvailabilityMacroMap)
112111
AST_BRIDGING_WRAPPER_NONNULL(PoundAvailableInfo)
113112

include/swift/AST/AvailabilitySpec.h

+18-38
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,19 @@ class AvailabilitySpec : public ASTAllocated<AvailabilitySpec> {
9494
llvm::VersionTuple version,
9595
SourceRange versionRange);
9696

97+
/// Creates an availability specification that guards execution based on the
98+
/// run-time platform and version, e.g., macOS >= 10.10.
99+
static AvailabilitySpec *createPlatformVersioned(ASTContext &ctx,
100+
PlatformKind platform,
101+
SourceLoc platformLoc,
102+
llvm::VersionTuple version,
103+
SourceRange versionRange);
104+
105+
AvailabilitySpec *clone(ASTContext &ctx) const {
106+
return new (ctx)
107+
AvailabilitySpec(Kind, Domain, SrcRange, Version, VersionStartLoc);
108+
}
109+
97110
AvailabilitySpecKind getKind() const { return Kind; }
98111

99112
bool isWildcard() { return getKind() == AvailabilitySpecKind::Wildcard; }
@@ -112,6 +125,11 @@ class AvailabilitySpec : public ASTAllocated<AvailabilitySpec> {
112125
// The platform version to compare against.
113126
llvm::VersionTuple getVersion() const;
114127

128+
// The version to be used in codegen for version comparisons at run time.
129+
// This is required to support beta versions of macOS Big Sur that
130+
// report 10.16 at run time.
131+
llvm::VersionTuple getRuntimeVersion() const { return Version; }
132+
115133
SourceRange getVersionSrcRange() const {
116134
if (!VersionStartLoc)
117135
return SourceRange();
@@ -123,44 +141,6 @@ class AvailabilitySpec : public ASTAllocated<AvailabilitySpec> {
123141
void setMacroLoc(SourceLoc loc) { MacroLoc = loc; }
124142
};
125143

126-
/// An availability specification that guards execution based on the
127-
/// run-time platform and version, e.g., OS X >= 10.10.
128-
class PlatformVersionConstraintAvailabilitySpec : public AvailabilitySpec {
129-
static std::optional<AvailabilityDomain>
130-
getDomainForPlatform(PlatformKind Platform) {
131-
if (Platform != PlatformKind::none)
132-
return AvailabilityDomain::forPlatform(Platform);
133-
return std::nullopt;
134-
}
135-
136-
public:
137-
PlatformVersionConstraintAvailabilitySpec(PlatformKind Platform,
138-
SourceLoc PlatformLoc,
139-
llvm::VersionTuple Version,
140-
SourceRange VersionSrcRange)
141-
: AvailabilitySpec(AvailabilitySpecKind::PlatformVersionConstraint,
142-
getDomainForPlatform(Platform),
143-
SourceRange(PlatformLoc, VersionSrcRange.End), Version,
144-
VersionSrcRange.Start) {}
145-
// The version to be used in codegen for version comparisons at run time.
146-
// This is required to support beta versions of macOS Big Sur that
147-
// report 10.16 at run time.
148-
llvm::VersionTuple getRuntimeVersion() const;
149-
150-
void print(raw_ostream &OS, unsigned Indent) const;
151-
152-
static bool classof(const AvailabilitySpec *Spec) {
153-
return Spec->getKind() == AvailabilitySpecKind::PlatformVersionConstraint;
154-
}
155-
156-
void *
157-
operator new(size_t Bytes, ASTContext &C,
158-
unsigned Alignment = alignof(PlatformVersionConstraintAvailabilitySpec)){
159-
return AvailabilitySpec::operator new(Bytes, C, AllocationArena::Permanent,
160-
Alignment);
161-
}
162-
};
163-
164144
/// Maps of macro name and version to availability specifications.
165145
/// Organized as two nested \c DenseMap keyed first on the macro name then
166146
/// the macro version. This structure allows to peek at macro names before

include/swift/AST/ConstTypeInfo.h

+3-5
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,7 @@ class BuilderValue : public CompileTimeValue {
218218
class ConditionalMember : public BuilderMember {
219219
public:
220220
ConditionalMember(MemberKind MemberKind,
221-
std::vector<PlatformVersionConstraintAvailabilitySpec>
222-
AvailabilityAttributes,
221+
std::vector<AvailabilitySpec> AvailabilityAttributes,
223222
std::vector<std::shared_ptr<BuilderMember>> IfElements,
224223
std::vector<std::shared_ptr<BuilderMember>> ElseElements)
225224
: BuilderMember(MemberKind),
@@ -239,7 +238,7 @@ class BuilderValue : public CompileTimeValue {
239238
(Kind == MemberKind::Optional);
240239
}
241240

242-
std::optional<std::vector<PlatformVersionConstraintAvailabilitySpec>>
241+
std::optional<std::vector<AvailabilitySpec>>
243242
getAvailabilityAttributes() const {
244243
return AvailabilityAttributes;
245244
}
@@ -251,8 +250,7 @@ class BuilderValue : public CompileTimeValue {
251250
}
252251

253252
private:
254-
std::optional<std::vector<PlatformVersionConstraintAvailabilitySpec>>
255-
AvailabilityAttributes;
253+
std::optional<std::vector<AvailabilitySpec>> AvailabilityAttributes;
256254
std::vector<std::shared_ptr<BuilderMember>> IfElements;
257255
std::vector<std::shared_ptr<BuilderMember>> ElseElements;
258256
};

include/swift/Parse/Parser.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ namespace llvm {
4242
}
4343

4444
namespace swift {
45+
class AvailabilitySpec;
4546
class CodeCompletionCallbacks;
4647
class DoneParsingCallback;
4748
class DefaultArgumentInitializer;
@@ -53,7 +54,6 @@ namespace swift {
5354
class SILParserStateBase;
5455
class SourceManager;
5556
class UUID;
56-
class PlatformVersionConstraintAvailabilitySpec;
5757

5858
struct EnumElementInfo;
5959

@@ -2057,8 +2057,7 @@ class Parser {
20572057
SmallVectorImpl<AvailabilitySpec *> &Specs);
20582058

20592059
ParserResult<AvailabilitySpec> parseAvailabilitySpec();
2060-
ParserResult<PlatformVersionConstraintAvailabilitySpec>
2061-
parsePlatformVersionConstraintSpec();
2060+
ParserResult<AvailabilitySpec> parsePlatformVersionConstraintSpec();
20622061
ParserResult<AvailabilitySpec> parsePlatformAgnosticVersionConstraintSpec();
20632062
bool
20642063
parseAvailability(bool parseAsPartOfSpecializeAttr, StringRef AttrName,

lib/AST/ASTDumper.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1100,13 +1100,12 @@ namespace {
11001100
[&](Label label) {
11011101
switch (Spec->getKind()) {
11021102
case AvailabilitySpecKind::PlatformVersionConstraint: {
1103-
auto plat = cast<PlatformVersionConstraintAvailabilitySpec>(Spec);
11041103
printHead("platform_version_constraint_availability_spec",
11051104
PatternColor, label);
1106-
printField(platformString(plat->getPlatform()),
1105+
printField(platformString(Spec->getPlatform()),
11071106
Label::always("platform"));
11081107
printFieldRaw(
1109-
[&](llvm::raw_ostream &OS) { OS << plat->getVersion(); },
1108+
[&](llvm::raw_ostream &OS) { OS << Spec->getVersion(); },
11101109
Label::always("version"));
11111110
printFoot();
11121111
break;

lib/AST/AvailabilityScope.cpp

+7-9
Original file line numberDiff line numberDiff line change
@@ -263,15 +263,13 @@ getAvailabilityConditionVersionSourceRange(const PoundAvailableInfo *PAI,
263263
PlatformKind Platform,
264264
const llvm::VersionTuple &Version) {
265265
SourceRange Range;
266-
for (auto *S : PAI->getQueries()) {
267-
if (auto *V = dyn_cast<PlatformVersionConstraintAvailabilitySpec>(S)) {
268-
if (V->getPlatform() == Platform && V->getVersion() == Version) {
269-
// More than one: return invalid range, no unique choice.
270-
if (Range.isValid())
271-
return SourceRange();
272-
else
273-
Range = V->getVersionSrcRange();
274-
}
266+
for (auto *Spec : PAI->getQueries()) {
267+
if (Spec->getPlatform() == Platform && Spec->getVersion() == Version) {
268+
// More than one: return invalid range, no unique choice.
269+
if (Range.isValid())
270+
return SourceRange();
271+
else
272+
Range = Spec->getVersionSrcRange();
275273
}
276274
}
277275
return Range;

lib/AST/AvailabilitySpec.cpp

+25-31
Original file line numberDiff line numberDiff line change
@@ -49,39 +49,33 @@ AvailabilitySpec *AvailabilitySpec::createPlatformAgnostic(
4949
version, versionRange.Start);
5050
}
5151

52-
llvm::VersionTuple AvailabilitySpec::getVersion() const {
53-
switch (getKind()) {
54-
case AvailabilitySpecKind::PlatformVersionConstraint: {
55-
auto spec = cast<PlatformVersionConstraintAvailabilitySpec>(this);
56-
// For macOS Big Sur, we canonicalize 10.16 to 11.0 for compile-time
57-
// checking since clang canonicalizes availability markup. However, to
58-
// support Beta versions of macOS Big Sur where the OS
59-
// reports 10.16 at run time, we need to compare against 10.16,
60-
//
61-
// This means for:
62-
//
63-
// if #available(macOS 10.16, *) { ... }
64-
//
65-
// we need to store the uncanonicalized version for codegen and canonicalize
66-
// it as necessary for compile-time checks.
67-
return canonicalizePlatformVersion(spec->getPlatform(), Version);
68-
}
69-
case AvailabilitySpecKind::LanguageVersionConstraint:
70-
case AvailabilitySpecKind::PackageDescriptionVersionConstraint:
71-
case AvailabilitySpecKind::Wildcard:
72-
return Version;
73-
}
52+
static std::optional<AvailabilityDomain>
53+
getDomainForPlatform(PlatformKind Platform) {
54+
if (Platform != PlatformKind::none)
55+
return AvailabilityDomain::forPlatform(Platform);
56+
return std::nullopt;
7457
}
7558

76-
void PlatformVersionConstraintAvailabilitySpec::print(raw_ostream &OS,
77-
unsigned Indent) const {
78-
OS.indent(Indent) << '(' << "platform_version_constraint_availability_spec"
79-
<< " platform='" << platformString(getPlatform()) << "'"
80-
<< " version='" << getVersion() << "'"
81-
<< ')';
59+
AvailabilitySpec *AvailabilitySpec::createPlatformVersioned(
60+
ASTContext &ctx, PlatformKind platform, SourceLoc platformLoc,
61+
llvm::VersionTuple version, SourceRange versionRange) {
62+
return new (ctx) AvailabilitySpec(
63+
AvailabilitySpecKind::PlatformVersionConstraint,
64+
getDomainForPlatform(platform),
65+
SourceRange(platformLoc, versionRange.End), version, versionRange.Start);
8266
}
8367

84-
llvm::VersionTuple
85-
PlatformVersionConstraintAvailabilitySpec::getRuntimeVersion() const {
86-
return Version;
68+
llvm::VersionTuple AvailabilitySpec::getVersion() const {
69+
// For macOS Big Sur, we canonicalize 10.16 to 11.0 for compile-time
70+
// checking since clang canonicalizes availability markup. However, to
71+
// support Beta versions of macOS Big Sur where the OS
72+
// reports 10.16 at run time, we need to compare against 10.16,
73+
//
74+
// This means for:
75+
//
76+
// if #available(macOS 10.16, *) { ... }
77+
//
78+
// we need to store the uncanonicalized version for codegen and canonicalize
79+
// it as necessary for compile-time checks.
80+
return canonicalizePlatformVersion(getPlatform(), Version);
8781
}

lib/AST/Bridging/AvailabilityBridging.cpp

+9-16
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,15 @@ BridgedAvailabilitySpec BridgedAvailabilitySpec_createPlatformAgnostic(
116116
cVersion.unbridged(), cVersionRange.unbridged());
117117
}
118118

119+
BridgedAvailabilitySpec BridgedAvailabilitySpec_createPlatformVersioned(
120+
BridgedASTContext cContext, BridgedPlatformKind cPlatform,
121+
BridgedSourceLoc cPlatformLoc, BridgedVersionTuple cVersion,
122+
BridgedSourceRange cVersionSrcRange) {
123+
return AvailabilitySpec::createPlatformVersioned(
124+
cContext.unbridged(), unbridge(cPlatform), cPlatformLoc.unbridged(),
125+
cVersion.unbridged(), cVersionSrcRange.unbridged());
126+
}
127+
119128
BridgedSourceRange
120129
BridgedAvailabilitySpec_getSourceRange(BridgedAvailabilitySpec spec) {
121130
return spec.unbridged()->getSourceRange();
@@ -144,22 +153,6 @@ BridgedAvailabilitySpec_getVersionRange(BridgedAvailabilitySpec spec) {
144153
return spec.unbridged()->getVersionSrcRange();
145154
}
146155

147-
BridgedPlatformVersionConstraintAvailabilitySpec
148-
BridgedPlatformVersionConstraintAvailabilitySpec_createParsed(
149-
BridgedASTContext cContext, BridgedPlatformKind cPlatform,
150-
BridgedSourceLoc cPlatformLoc, BridgedVersionTuple cVersion,
151-
BridgedSourceRange cVersionSrcRange) {
152-
return new (cContext.unbridged()) PlatformVersionConstraintAvailabilitySpec(
153-
unbridge(cPlatform), cPlatformLoc.unbridged(), cVersion.unbridged(),
154-
cVersionSrcRange.unbridged());
155-
}
156-
157-
BridgedAvailabilitySpec
158-
BridgedPlatformVersionConstraintAvailabilitySpec_asAvailabilitySpec(
159-
BridgedPlatformVersionConstraintAvailabilitySpec spec) {
160-
return static_cast<AvailabilitySpec *>(spec.unbridged());
161-
}
162-
163156
//===----------------------------------------------------------------------===//
164157
// MARK: AvailabilityDomain
165158
//===----------------------------------------------------------------------===//

lib/ASTGen/Sources/ASTGen/Availability.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -329,14 +329,14 @@ extension ASTGenVisitor {
329329
// TODO: Diagnostics.
330330
fatalError("expected version")
331331
}
332-
let spec = BridgedPlatformVersionConstraintAvailabilitySpec.createParsed(
332+
let spec = BridgedAvailabilitySpec.createPlatformVersioned(
333333
self.ctx,
334334
platform: platform,
335335
platformLoc: nameLoc,
336336
version: version.bridged,
337337
versionRange: versionRange
338338
)
339-
result.append(spec.asAvailabilitySpec)
339+
result.append(spec)
340340
}
341341
}
342342
}

lib/ConstExtract/ConstExtract.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -1001,7 +1001,7 @@ getResultBuilderElementFromASTNode(const ASTNode node) {
10011001

10021002
BuilderValue::ConditionalMember
10031003
getConditionalMemberFromIfStmt(const IfStmt *ifStmt) {
1004-
std::vector<PlatformVersionConstraintAvailabilitySpec> AvailabilityAttributes;
1004+
std::vector<AvailabilitySpec> AvailabilityAttributes;
10051005
std::vector<std::shared_ptr<BuilderValue::BuilderMember>> IfElements;
10061006
std::vector<std::shared_ptr<BuilderValue::BuilderMember>> ElseElements;
10071007
if (auto thenBraceStmt = ifStmt->getThenStmt()) {
@@ -1034,9 +1034,8 @@ getConditionalMemberFromIfStmt(const IfStmt *ifStmt) {
10341034
for (auto elt : ifStmt->getCond()) {
10351035
if (elt.getKind() == StmtConditionElement::CK_Availability) {
10361036
for (auto *Q : elt.getAvailability()->getQueries()) {
1037-
if (auto *availability =
1038-
dyn_cast<PlatformVersionConstraintAvailabilitySpec>(Q)) {
1039-
AvailabilityAttributes.push_back(*availability);
1037+
if (Q->getPlatform() != PlatformKind::none) {
1038+
AvailabilityAttributes.push_back(*Q);
10401039
}
10411040
}
10421041
memberKind = BuilderValue::LimitedAvailability;

lib/Parse/ParseDecl.cpp

+5-9
Original file line numberDiff line numberDiff line change
@@ -1850,15 +1850,11 @@ Parser::parseAvailabilityMacro(SmallVectorImpl<AvailabilitySpec *> &Specs) {
18501850
// Make a copy of the specs to add the macro source location
18511851
// for the diagnostic about the use of macros in inlinable code.
18521852
SourceLoc MacroLoc = Tok.getLoc();
1853-
for (auto *Spec : VersionMatch->getSecond())
1854-
if (auto *PlatformVersionSpec =
1855-
dyn_cast<PlatformVersionConstraintAvailabilitySpec>(Spec)) {
1856-
auto SpecCopy =
1857-
new (Context) PlatformVersionConstraintAvailabilitySpec(
1858-
*PlatformVersionSpec);
1859-
SpecCopy->setMacroLoc(MacroLoc);
1860-
Specs.push_back(SpecCopy);
1861-
}
1853+
for (auto *Spec : VersionMatch->getSecond()) {
1854+
auto SpecCopy = Spec->clone(Context);
1855+
SpecCopy->setMacroLoc(MacroLoc);
1856+
Specs.push_back(SpecCopy);
1857+
}
18621858

18631859
return makeParserSuccess();
18641860
}

lib/Parse/ParseExpr.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -3735,8 +3735,7 @@ Parser::parsePlatformAgnosticVersionConstraintSpec() {
37353735
///
37363736
/// platform-version-constraint-spec:
37373737
/// identifier version-comparison version-tuple
3738-
ParserResult<PlatformVersionConstraintAvailabilitySpec>
3739-
Parser::parsePlatformVersionConstraintSpec() {
3738+
ParserResult<AvailabilitySpec> Parser::parsePlatformVersionConstraintSpec() {
37403739
Identifier PlatformIdentifier;
37413740
SourceLoc PlatformLoc;
37423741
if (Tok.is(tok::code_complete)) {
@@ -3786,7 +3785,6 @@ Parser::parsePlatformVersionConstraintSpec() {
37863785
// Register the platform name as a keyword token.
37873786
TokReceiver->registerTokenKindChange(PlatformLoc, tok::contextual_keyword);
37883787

3789-
return makeParserResult(
3790-
new (Context) PlatformVersionConstraintAvailabilitySpec(
3791-
Platform.value(), PlatformLoc, Version, VersionRange));
3788+
return makeParserResult(AvailabilitySpec::createPlatformVersioned(
3789+
Context, Platform.value(), PlatformLoc, Version, VersionRange));
37923790
}

0 commit comments

Comments
 (0)