Skip to content

Commit 1d509c7

Browse files
authored
Merge pull request #79354 from tshortli/retire-availability-spec-subclasses
AST: Retire subclasses of `AvailabilitySpec`
2 parents 153421f + 670084a commit 1d509c7

18 files changed

+266
-423
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -626,13 +626,33 @@ struct BridgedAvailabilityMacroDefinition {
626626

627627
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAvailabilitySpecKind {
628628
BridgedAvailabilitySpecKindPlatformVersionConstraint,
629-
BridgedAvailabilitySpecKindOtherPlatform,
629+
BridgedAvailabilitySpecKindWildcard,
630630
BridgedAvailabilitySpecKindLanguageVersionConstraint,
631631
BridgedAvailabilitySpecKindPackageDescriptionVersionConstraint,
632632
};
633633

634634
struct BridgedAvailabilityDomain;
635635

636+
SWIFT_NAME("BridgedAvailabilitySpec.createWildcard(_:loc:)")
637+
BridgedAvailabilitySpec
638+
BridgedAvailabilitySpec_createWildcard(BridgedASTContext cContext,
639+
BridgedSourceLoc cLoc);
640+
641+
SWIFT_NAME(
642+
"BridgedAvailabilitySpec.createPlatformAgnostic(_:kind:nameLoc:version:"
643+
"versionRange:)")
644+
BridgedAvailabilitySpec BridgedAvailabilitySpec_createPlatformAgnostic(
645+
BridgedASTContext cContext, BridgedAvailabilitySpecKind cKind,
646+
BridgedSourceLoc cLoc, BridgedVersionTuple cVersion,
647+
BridgedSourceRange cVersionRange);
648+
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+
636656
SWIFT_NAME("getter:BridgedAvailabilitySpec.sourceRange(self:)")
637657
BridgedSourceRange
638658
BridgedAvailabilitySpec_getSourceRange(BridgedAvailabilitySpec spec);
@@ -653,44 +673,6 @@ SWIFT_NAME("getter:BridgedAvailabilitySpec.versionRange(self:)")
653673
BridgedSourceRange
654674
BridgedAvailabilitySpec_getVersionRange(BridgedAvailabilitySpec spec);
655675

656-
SWIFT_NAME("BridgedPlatformVersionConstraintAvailabilitySpec.createParsed(_:"
657-
"platform:platformLoc:version:versionRange:)")
658-
BridgedPlatformVersionConstraintAvailabilitySpec
659-
BridgedPlatformVersionConstraintAvailabilitySpec_createParsed(
660-
BridgedASTContext cContext, BridgedPlatformKind cPlatform,
661-
BridgedSourceLoc cPlatformLoc, BridgedVersionTuple cVersion,
662-
BridgedSourceRange cVersionSrcRange);
663-
664-
SWIFT_NAME("BridgedPlatformAgnosticVersionConstraintAvailabilitySpec."
665-
"createParsed(_:kind:nameLoc:version:versionRange:)")
666-
BridgedPlatformAgnosticVersionConstraintAvailabilitySpec
667-
BridgedPlatformAgnosticVersionConstraintAvailabilitySpec_createParsed(
668-
BridgedASTContext cContext, BridgedAvailabilitySpecKind cKind,
669-
BridgedSourceLoc cNameLoc, BridgedVersionTuple cVersion,
670-
BridgedSourceRange cVersionSrcRange);
671-
672-
SWIFT_NAME("BridgedOtherPlatformAvailabilitySpec.createParsed(_:loc:)")
673-
BridgedOtherPlatformAvailabilitySpec
674-
BridgedOtherPlatformAvailabilitySpec_createParsed(BridgedASTContext cContext,
675-
BridgedSourceLoc cLoc);
676-
677-
SWIFT_NAME("getter:BridgedPlatformVersionConstraintAvailabilitySpec."
678-
"asAvailabilitySpec(self:)")
679-
BridgedAvailabilitySpec
680-
BridgedPlatformVersionConstraintAvailabilitySpec_asAvailabilitySpec(
681-
BridgedPlatformVersionConstraintAvailabilitySpec spec);
682-
683-
SWIFT_NAME("getter:BridgedPlatformAgnosticVersionConstraintAvailabilitySpec."
684-
"asAvailabilitySpec(self:)")
685-
BridgedAvailabilitySpec
686-
BridgedPlatformAgnosticVersionConstraintAvailabilitySpec_asAvailabilitySpec(
687-
BridgedPlatformAgnosticVersionConstraintAvailabilitySpec spec);
688-
689-
SWIFT_NAME(
690-
"getter:BridgedOtherPlatformAvailabilitySpec.asAvailabilitySpec(self:)")
691-
BridgedAvailabilitySpec BridgedOtherPlatformAvailabilitySpec_asAvailabilitySpec(
692-
BridgedOtherPlatformAvailabilitySpec spec);
693-
694676
struct BridgedAvailabilityDomain {
695677
void *_Nullable opaque;
696678

include/swift/AST/ASTBridgingWrappers.def

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +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)
111-
AST_BRIDGING_WRAPPER_NULLABLE(PlatformAgnosticVersionConstraintAvailabilitySpec)
112-
AST_BRIDGING_WRAPPER_NULLABLE(OtherPlatformAvailabilitySpec)
113110
AST_BRIDGING_WRAPPER_CONST_NONNULL(AvailabilityMacroMap)
114111
AST_BRIDGING_WRAPPER_NONNULL(PoundAvailableInfo)
115112

include/swift/AST/AvailabilitySpec.h

Lines changed: 51 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,19 @@ namespace swift {
3030
class ASTContext;
3131

3232
enum class AvailabilitySpecKind {
33-
/// A platform-version constraint of the form "PlatformName X.Y.Z"
34-
PlatformVersionConstraint,
33+
/// A platform-version constraint of the form "PlatformName X.Y.Z"
34+
PlatformVersionConstraint,
3535

36-
/// A wildcard constraint, spelled '*', that is equivalent
37-
/// to CurrentPlatformName >= MinimumDeploymentTargetVersion
38-
OtherPlatform,
36+
/// A wildcard constraint, spelled '*', that is equivalent
37+
/// to CurrentPlatformName >= MinimumDeploymentTargetVersion
38+
Wildcard,
3939

40-
/// A language-version constraint of the form "swift X.Y.Z"
41-
LanguageVersionConstraint,
40+
/// A language-version constraint of the form "swift X.Y.Z"
41+
LanguageVersionConstraint,
4242

43-
/// A PackageDescription version constraint of the form "_PackageDescription X.Y.Z"
44-
PackageDescriptionVersionConstraint,
43+
/// A PackageDescription version constraint of the form "_PackageDescription
44+
/// X.Y.Z"
45+
PackageDescriptionVersionConstraint,
4546
};
4647

4748
/// The root class for specifications of API availability in availability
@@ -65,16 +66,51 @@ class AvailabilitySpec : public ASTAllocated<AvailabilitySpec> {
6566
// Location of the availability macro expanded to create this spec.
6667
SourceLoc MacroLoc;
6768

68-
public:
6969
AvailabilitySpec(AvailabilitySpecKind Kind,
7070
std::optional<AvailabilityDomain> Domain,
7171
SourceRange SrcRange, llvm::VersionTuple Version,
7272
SourceLoc VersionStartLoc)
7373
: Kind(Kind), Domain(Domain), SrcRange(SrcRange), Version(Version),
7474
VersionStartLoc(VersionStartLoc) {}
7575

76+
public:
77+
/// Creates a wildcard availability specification that guards execution
78+
/// by checking that the run-time version is greater than the minimum
79+
/// deployment target. This specification is designed to ease porting
80+
/// to new platforms. Because new platforms typically branch from
81+
/// existing platforms, the wildcard allows an #available() check to do the
82+
/// "right" thing (executing the guarded branch) on the new platform without
83+
/// requiring a modification to every availability guard in the program. Note
84+
/// that we still do compile-time availability checking with '*', so the
85+
/// compiler will still catch references to potentially unavailable symbols.
86+
static AvailabilitySpec *createWildcard(ASTContext &ctx, SourceLoc starLoc);
87+
88+
/// Creates an availability specification that guards execution based on the
89+
/// compile-time platform agnostic version, e.g., swift >= 3.0.1,
90+
/// package-description >= 4.0.
91+
static AvailabilitySpec *createPlatformAgnostic(ASTContext &ctx,
92+
AvailabilitySpecKind kind,
93+
SourceLoc nameLoc,
94+
llvm::VersionTuple version,
95+
SourceRange versionRange);
96+
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+
76110
AvailabilitySpecKind getKind() const { return Kind; }
77111

112+
bool isWildcard() { return getKind() == AvailabilitySpecKind::Wildcard; }
113+
78114
SourceRange getSourceRange() const { return SrcRange; }
79115
SourceLoc getStartLoc() const { return SrcRange.Start; }
80116

@@ -89,6 +125,11 @@ class AvailabilitySpec : public ASTAllocated<AvailabilitySpec> {
89125
// The platform version to compare against.
90126
llvm::VersionTuple getVersion() const;
91127

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+
92133
SourceRange getVersionSrcRange() const {
93134
if (!VersionStartLoc)
94135
return SourceRange();
@@ -100,121 +141,6 @@ class AvailabilitySpec : public ASTAllocated<AvailabilitySpec> {
100141
void setMacroLoc(SourceLoc loc) { MacroLoc = loc; }
101142
};
102143

103-
/// An availability specification that guards execution based on the
104-
/// run-time platform and version, e.g., OS X >= 10.10.
105-
class PlatformVersionConstraintAvailabilitySpec : public AvailabilitySpec {
106-
static std::optional<AvailabilityDomain>
107-
getDomainForPlatform(PlatformKind Platform) {
108-
if (Platform != PlatformKind::none)
109-
return AvailabilityDomain::forPlatform(Platform);
110-
return std::nullopt;
111-
}
112-
113-
public:
114-
PlatformVersionConstraintAvailabilitySpec(PlatformKind Platform,
115-
SourceLoc PlatformLoc,
116-
llvm::VersionTuple Version,
117-
SourceRange VersionSrcRange)
118-
: AvailabilitySpec(AvailabilitySpecKind::PlatformVersionConstraint,
119-
getDomainForPlatform(Platform),
120-
SourceRange(PlatformLoc, VersionSrcRange.End), Version,
121-
VersionSrcRange.Start) {}
122-
// The version to be used in codegen for version comparisons at run time.
123-
// This is required to support beta versions of macOS Big Sur that
124-
// report 10.16 at run time.
125-
llvm::VersionTuple getRuntimeVersion() const;
126-
127-
void print(raw_ostream &OS, unsigned Indent) const;
128-
129-
static bool classof(const AvailabilitySpec *Spec) {
130-
return Spec->getKind() == AvailabilitySpecKind::PlatformVersionConstraint;
131-
}
132-
133-
void *
134-
operator new(size_t Bytes, ASTContext &C,
135-
unsigned Alignment = alignof(PlatformVersionConstraintAvailabilitySpec)){
136-
return AvailabilitySpec::operator new(Bytes, C, AllocationArena::Permanent,
137-
Alignment);
138-
}
139-
};
140-
141-
/// An availability specification that guards execution based on the
142-
/// compile-time platform agnostic version, e.g., swift >= 3.0.1,
143-
/// package-description >= 4.0.
144-
class PlatformAgnosticVersionConstraintAvailabilitySpec
145-
: public AvailabilitySpec {
146-
147-
static AvailabilityDomain getDomainForSpecKind(AvailabilitySpecKind Kind) {
148-
switch (Kind) {
149-
case AvailabilitySpecKind::PlatformVersionConstraint:
150-
case AvailabilitySpecKind::OtherPlatform:
151-
llvm_unreachable("unexpected spec kind");
152-
case AvailabilitySpecKind::LanguageVersionConstraint:
153-
return AvailabilityDomain::forSwiftLanguage();
154-
case AvailabilitySpecKind::PackageDescriptionVersionConstraint:
155-
return AvailabilityDomain::forPackageDescription();
156-
}
157-
}
158-
159-
public:
160-
PlatformAgnosticVersionConstraintAvailabilitySpec(
161-
AvailabilitySpecKind AvailabilitySpecKind,
162-
SourceLoc PlatformAgnosticNameLoc, llvm::VersionTuple Version,
163-
SourceRange VersionSrcRange)
164-
: AvailabilitySpec(
165-
AvailabilitySpecKind, getDomainForSpecKind(AvailabilitySpecKind),
166-
SourceRange(PlatformAgnosticNameLoc, VersionSrcRange.End), Version,
167-
VersionSrcRange.Start) {
168-
assert(AvailabilitySpecKind == AvailabilitySpecKind::LanguageVersionConstraint ||
169-
AvailabilitySpecKind == AvailabilitySpecKind::PackageDescriptionVersionConstraint);
170-
}
171-
172-
void print(raw_ostream &OS, unsigned Indent) const;
173-
174-
static bool classof(const AvailabilitySpec *Spec) {
175-
return Spec->getKind() == AvailabilitySpecKind::LanguageVersionConstraint ||
176-
Spec->getKind() == AvailabilitySpecKind::PackageDescriptionVersionConstraint;
177-
}
178-
179-
void *
180-
operator new(size_t Bytes, ASTContext &C,
181-
unsigned Alignment = alignof(PlatformAgnosticVersionConstraintAvailabilitySpec)){
182-
return AvailabilitySpec::operator new(Bytes, C, AllocationArena::Permanent,
183-
Alignment);
184-
}
185-
};
186-
187-
/// A wildcard availability specification that guards execution
188-
/// by checking that the run-time version is greater than the minimum
189-
/// deployment target. This specification is designed to ease porting
190-
/// to new platforms. Because new platforms typically branch from
191-
/// existing platforms, the wildcard allows an #available() check to do the
192-
/// "right" thing (executing the guarded branch) on the new platform without
193-
/// requiring a modification to every availability guard in the program. Note
194-
/// that we still do compile-time availability checking with '*', so the
195-
/// compiler will still catch references to potentially unavailable symbols.
196-
class OtherPlatformAvailabilitySpec : public AvailabilitySpec {
197-
public:
198-
OtherPlatformAvailabilitySpec(SourceLoc StarLoc)
199-
: AvailabilitySpec(AvailabilitySpecKind::OtherPlatform, std::nullopt,
200-
StarLoc,
201-
/*Version=*/{},
202-
/*VersionStartLoc=*/{}) {}
203-
204-
void print(raw_ostream &OS, unsigned Indent) const;
205-
206-
static bool classof(const AvailabilitySpec *Spec) {
207-
return Spec->getKind() == AvailabilitySpecKind::OtherPlatform;
208-
}
209-
210-
void *
211-
operator new(size_t Bytes, ASTContext &C,
212-
unsigned Alignment = alignof(OtherPlatformAvailabilitySpec)) {
213-
return AvailabilitySpec::operator new(Bytes, C, AllocationArena::Permanent,
214-
Alignment);
215-
}
216-
};
217-
218144
/// Maps of macro name and version to availability specifications.
219145
/// Organized as two nested \c DenseMap keyed first on the macro name then
220146
/// the macro version. This structure allows to peek at macro names before

include/swift/AST/ConstTypeInfo.h

Lines changed: 3 additions & 5 deletions
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

Lines changed: 3 additions & 6 deletions
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,8 +54,6 @@ namespace swift {
5354
class SILParserStateBase;
5455
class SourceManager;
5556
class UUID;
56-
class PlatformVersionConstraintAvailabilitySpec;
57-
class PlatformAgnosticVersionConstraintAvailabilitySpec;
5857

5958
struct EnumElementInfo;
6059

@@ -2058,10 +2057,8 @@ class Parser {
20582057
SmallVectorImpl<AvailabilitySpec *> &Specs);
20592058

20602059
ParserResult<AvailabilitySpec> parseAvailabilitySpec();
2061-
ParserResult<PlatformVersionConstraintAvailabilitySpec>
2062-
parsePlatformVersionConstraintSpec();
2063-
ParserResult<PlatformAgnosticVersionConstraintAvailabilitySpec>
2064-
parsePlatformAgnosticVersionConstraintSpec();
2060+
ParserResult<AvailabilitySpec> parsePlatformVersionConstraintSpec();
2061+
ParserResult<AvailabilitySpec> parsePlatformAgnosticVersionConstraintSpec();
20652062
bool
20662063
parseAvailability(bool parseAsPartOfSpecializeAttr, StringRef AttrName,
20672064
bool &DiscardAttribute, SourceRange &attrRange,

0 commit comments

Comments
 (0)