Skip to content

Commit 66f2027

Browse files
committed
s/Version/PlatformVersion/ to availability specs, add LanguageVersion.
1 parent c4e8c52 commit 66f2027

File tree

9 files changed

+87
-30
lines changed

9 files changed

+87
-30
lines changed

include/swift/AST/AvailabilitySpec.h

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,15 @@ class ASTContext;
2828
enum class VersionComparison { GreaterThanEqual };
2929

3030
enum class AvailabilitySpecKind {
31-
/// A version constraint of the form PlatformName X.Y.Z
32-
VersionConstraint,
31+
/// A platform-version constraint of the form "PlatformName X.Y.Z"
32+
PlatformVersionConstraint,
3333

3434
/// A wildcard constraint, spelled '*', that is be equivalent
3535
/// to CurrentPlatformName >= MinimumDeploymentTargetVersion
36-
OtherPlatform
36+
OtherPlatform,
37+
38+
/// A language-version constraint of the form "swift X.Y.Z"
39+
LanguageVersionConstraint,
3740
};
3841

3942
/// The root class for specifications of API availability in availability
@@ -57,22 +60,22 @@ class AvailabilitySpec {
5760

5861
/// \brief An availability specification that guards execution based on the
5962
/// run-time platform and version, e.g., OS X >= 10.10.
60-
class VersionConstraintAvailabilitySpec : public AvailabilitySpec {
63+
class PlatformVersionConstraintAvailabilitySpec : public AvailabilitySpec {
6164
PlatformKind Platform;
6265
SourceLoc PlatformLoc;
6366

6467
clang::VersionTuple Version;
6568
SourceRange VersionSrcRange;
6669

6770
public:
68-
VersionConstraintAvailabilitySpec(PlatformKind Platform,
69-
SourceLoc PlatformLoc,
70-
clang::VersionTuple Version,
71-
SourceRange VersionSrcRange)
72-
: AvailabilitySpec(AvailabilitySpecKind::VersionConstraint),
73-
Platform(Platform),
74-
PlatformLoc(PlatformLoc), Version(Version),
75-
VersionSrcRange(VersionSrcRange) {}
71+
PlatformVersionConstraintAvailabilitySpec(PlatformKind Platform,
72+
SourceLoc PlatformLoc,
73+
clang::VersionTuple Version,
74+
SourceRange VersionSrcRange)
75+
: AvailabilitySpec(AvailabilitySpecKind::PlatformVersionConstraint),
76+
Platform(Platform),
77+
PlatformLoc(PlatformLoc), Version(Version),
78+
VersionSrcRange(VersionSrcRange) {}
7679

7780
/// The required platform.
7881
PlatformKind getPlatform() const { return Platform; }
@@ -87,12 +90,49 @@ class VersionConstraintAvailabilitySpec : public AvailabilitySpec {
8790
void print(raw_ostream &OS, unsigned Indent) const;
8891

8992
static bool classof(const AvailabilitySpec *Spec) {
90-
return Spec->getKind() == AvailabilitySpecKind::VersionConstraint;
93+
return Spec->getKind() == AvailabilitySpecKind::PlatformVersionConstraint;
94+
}
95+
96+
void *
97+
operator new(size_t Bytes, ASTContext &C,
98+
unsigned Alignment = alignof(PlatformVersionConstraintAvailabilitySpec)){
99+
return AvailabilitySpec::operator new(Bytes, C, Alignment);
100+
}
101+
};
102+
103+
/// \brief An availability specification that guards execution based on the
104+
/// compile-time language version, e.g., swift >= 3.0.1.
105+
class LanguageVersionConstraintAvailabilitySpec : public AvailabilitySpec {
106+
SourceLoc SwiftLoc;
107+
108+
clang::VersionTuple Version;
109+
SourceRange VersionSrcRange;
110+
111+
public:
112+
LanguageVersionConstraintAvailabilitySpec(SourceLoc SwiftLoc,
113+
clang::VersionTuple Version,
114+
SourceRange VersionSrcRange)
115+
: AvailabilitySpec(AvailabilitySpecKind::LanguageVersionConstraint),
116+
SwiftLoc(SwiftLoc), Version(Version),
117+
VersionSrcRange(VersionSrcRange) {}
118+
119+
SourceLoc getSwiftLoc() const { return SwiftLoc; }
120+
121+
// The platform version to compare against.
122+
clang::VersionTuple getVersion() const { return Version; }
123+
SourceRange getVersionSrcRange() const { return VersionSrcRange; }
124+
125+
SourceRange getSourceRange() const;
126+
127+
void print(raw_ostream &OS, unsigned Indent) const;
128+
129+
static bool classof(const AvailabilitySpec *Spec) {
130+
return Spec->getKind() == AvailabilitySpecKind::LanguageVersionConstraint;
91131
}
92132

93133
void *
94134
operator new(size_t Bytes, ASTContext &C,
95-
unsigned Alignment = alignof(VersionConstraintAvailabilitySpec)){
135+
unsigned Alignment = alignof(LanguageVersionConstraintAvailabilitySpec)){
96136
return AvailabilitySpec::operator new(Bytes, C, Alignment);
97137
}
98138
};

include/swift/Parse/Parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1245,7 +1245,7 @@ class Parser {
12451245
parseAvailabilitySpecList(SmallVectorImpl<AvailabilitySpec *> &Specs);
12461246

12471247
ParserResult<AvailabilitySpec> parseAvailabilitySpec();
1248-
ParserResult<VersionConstraintAvailabilitySpec> parseVersionConstraintSpec();
1248+
ParserResult<PlatformVersionConstraintAvailabilitySpec> parseVersionConstraintSpec();
12491249
};
12501250

12511251
/// Describes a parsed declaration name.

lib/AST/ASTDumper.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,8 +1215,11 @@ class PrintStmt : public StmtVisitor<PrintStmt> {
12151215
for (auto *Query : C.getAvailability()->getQueries()) {
12161216
OS << '\n';
12171217
switch (Query->getKind()) {
1218-
case AvailabilitySpecKind::VersionConstraint:
1219-
cast<VersionConstraintAvailabilitySpec>(Query)->print(OS, Indent + 2);
1218+
case AvailabilitySpecKind::PlatformVersionConstraint:
1219+
cast<PlatformVersionConstraintAvailabilitySpec>(Query)->print(OS, Indent + 2);
1220+
break;
1221+
case AvailabilitySpecKind::LanguageVersionConstraint:
1222+
cast<LanguageVersionConstraintAvailabilitySpec>(Query)->print(OS, Indent + 2);
12201223
break;
12211224
case AvailabilitySpecKind::OtherPlatform:
12221225
cast<OtherPlatformAvailabilitySpec>(Query)->print(OS, Indent + 2);

lib/AST/AvailabilitySpec.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ using namespace swift;
2222

2323
SourceRange AvailabilitySpec::getSourceRange() const {
2424
switch (getKind()) {
25-
case AvailabilitySpecKind::VersionConstraint:
26-
return cast<VersionConstraintAvailabilitySpec>(this)->getSourceRange();
25+
case AvailabilitySpecKind::PlatformVersionConstraint:
26+
return cast<PlatformVersionConstraintAvailabilitySpec>(this)->getSourceRange();
27+
28+
case AvailabilitySpecKind::LanguageVersionConstraint:
29+
return cast<LanguageVersionConstraintAvailabilitySpec>(this)->getSourceRange();
2730

2831
case AvailabilitySpecKind::OtherPlatform:
2932
return cast<OtherPlatformAvailabilitySpec>(this)->getSourceRange();
@@ -39,20 +42,31 @@ void *AvailabilitySpec::operator new(size_t Bytes, ASTContext &C,
3942
}
4043

4144

42-
SourceRange VersionConstraintAvailabilitySpec::getSourceRange() const {
45+
SourceRange PlatformVersionConstraintAvailabilitySpec::getSourceRange() const {
4346
return SourceRange(PlatformLoc, VersionSrcRange.End);
4447
}
4548

46-
void VersionConstraintAvailabilitySpec::print(raw_ostream &OS,
49+
void PlatformVersionConstraintAvailabilitySpec::print(raw_ostream &OS,
4750
unsigned Indent) const {
48-
OS.indent(Indent) << '(' << "version_constraint_availability_spec"
51+
OS.indent(Indent) << '(' << "platform_version_constraint_availability_spec"
4952
<< " platform='" << platformString(getPlatform()) << "'"
5053
<< " version='" << getVersion() << "'"
5154
<< ')';
5255
}
5356

57+
SourceRange LanguageVersionConstraintAvailabilitySpec::getSourceRange() const {
58+
return SourceRange(SwiftLoc, VersionSrcRange.End);
59+
}
60+
61+
void LanguageVersionConstraintAvailabilitySpec::print(raw_ostream &OS,
62+
unsigned Indent) const {
63+
OS.indent(Indent) << '(' << "language_version_constraint_availability_spec"
64+
<< " version='" << getVersion() << "'"
65+
<< ')';
66+
}
67+
5468
void OtherPlatformAvailabilitySpec::print(raw_ostream &OS, unsigned Indent) const {
55-
OS.indent(Indent) << '(' << "version_constraint_availability_spec"
69+
OS.indent(Indent) << '(' << "other_constraint_availability_spec"
5670
<< " "
5771
<< ')';
5872
}

lib/AST/Stmt.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ void PoundAvailableInfo::
287287
getPlatformKeywordLocs(SmallVectorImpl<SourceLoc> &PlatformLocs) {
288288
for (unsigned i = 0; i < NumQueries; i++) {
289289
auto *VersionSpec =
290-
dyn_cast<VersionConstraintAvailabilitySpec>(getQueries()[i]);
290+
dyn_cast<PlatformVersionConstraintAvailabilitySpec>(getQueries()[i]);
291291
if (!VersionSpec)
292292
continue;
293293

lib/Parse/ParseDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ bool Parser::parseNewDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc,
740740
// @available(iOS, introduced: 8.0)
741741
// @available(OSX, introduced: 10.10)
742742
for (auto *Spec : Specs) {
743-
auto *VersionSpec = dyn_cast<VersionConstraintAvailabilitySpec>(Spec);
743+
auto *VersionSpec = dyn_cast<PlatformVersionConstraintAvailabilitySpec>(Spec);
744744
if (!VersionSpec)
745745
continue;
746746

lib/Parse/ParseExpr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2984,7 +2984,7 @@ ParserResult<AvailabilitySpec> Parser::parseAvailabilitySpec() {
29842984
///
29852985
/// version-constraint-spec:
29862986
/// identifier version-comparison version-tuple
2987-
ParserResult<VersionConstraintAvailabilitySpec>
2987+
ParserResult<PlatformVersionConstraintAvailabilitySpec>
29882988
Parser::parseVersionConstraintSpec() {
29892989
Identifier PlatformIdentifier;
29902990
SourceLoc PlatformLoc;
@@ -3024,7 +3024,7 @@ Parser::parseVersionConstraintSpec() {
30243024
return nullptr;
30253025
}
30263026

3027-
return makeParserResult(new (Context) VersionConstraintAvailabilitySpec(
3027+
return makeParserResult(new (Context) PlatformVersionConstraintAvailabilitySpec(
30283028
Platform.getValue(), PlatformLoc, Version, VersionRange));
30293029
}
30303030

lib/Parse/ParseStmt.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1047,7 +1047,7 @@ static void validateAvailabilitySpecList(Parser &P,
10471047
continue;
10481048
}
10491049

1050-
auto *VersionSpec = cast<VersionConstraintAvailabilitySpec>(Spec);
1050+
auto *VersionSpec = cast<PlatformVersionConstraintAvailabilitySpec>(Spec);
10511051
bool Inserted = Platforms.insert(VersionSpec->getPlatform()).second;
10521052
if (!Inserted) {
10531053
// Rule out multiple version specs referring to the same platform.

lib/Sema/TypeChecker.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,7 +1383,7 @@ class TypeRefinementContextBuilder : private ASTWalker {
13831383
continue;
13841384
}
13851385

1386-
auto *VersionSpec = dyn_cast<VersionConstraintAvailabilitySpec>(Spec);
1386+
auto *VersionSpec = dyn_cast<PlatformVersionConstraintAvailabilitySpec>(Spec);
13871387
if (!VersionSpec)
13881388
continue;
13891389

@@ -1407,7 +1407,7 @@ class TypeRefinementContextBuilder : private ASTWalker {
14071407
return AvailabilityContext::alwaysAvailable();
14081408
}
14091409

1410-
auto *VersionSpec = cast<VersionConstraintAvailabilitySpec>(Spec);
1410+
auto *VersionSpec = cast<PlatformVersionConstraintAvailabilitySpec>(Spec);
14111411
return AvailabilityContext(VersionRange::allGTE(VersionSpec->getVersion()));
14121412
}
14131413

0 commit comments

Comments
 (0)