Skip to content

Commit 0eb2917

Browse files
committed
AST/Sema: Adopt AvailabilityContext in TypeRefinementContext.
Begin using `AvailabilityContext` as the availability representation in `TypeRefinementContext`, instead of only storing platform introduction availability ranges. There should be no functional changes since this just changes the representation of the existing information stored by `TypeRefinementContext`. However, in the future `AvailabilityContext` will be expanded to represent additional availability constraints.
1 parent 439c595 commit 0eb2917

File tree

4 files changed

+101
-86
lines changed

4 files changed

+101
-86
lines changed

include/swift/AST/Availability.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -382,9 +382,7 @@ class AvailabilityContext : public llvm::FoldingSetNode {
382382
/// availability parameters.
383383
static const AvailabilityContext *
384384
get(const AvailabilityRange &platformAvailability, ASTContext &ctx) {
385-
PlatformInfo platformInfo{
386-
.Range = platformAvailability,
387-
};
385+
PlatformInfo platformInfo{platformAvailability};
388386
return get(platformInfo, ctx);
389387
}
390388

include/swift/AST/TypeRefinementContext.h

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ class TypeRefinementContext : public ASTAllocated<TypeRefinementContext> {
171171

172172
/// A canonical availability info for this context, computed top-down from the
173173
/// root context.
174-
AvailabilityRange AvailabilityInfo;
174+
const AvailabilityContext *AvailabilityInfo;
175175

176176
std::vector<TypeRefinementContext *> Children;
177177

@@ -184,33 +184,33 @@ class TypeRefinementContext : public ASTAllocated<TypeRefinementContext> {
184184

185185
TypeRefinementContext(ASTContext &Ctx, IntroNode Node,
186186
TypeRefinementContext *Parent, SourceRange SrcRange,
187-
const AvailabilityRange &Info);
187+
const AvailabilityContext *Info);
188188

189189
public:
190190
/// Create the root refinement context for the given SourceFile.
191191
static TypeRefinementContext *
192-
createForSourceFile(SourceFile *SF, const AvailabilityRange &Info);
192+
createForSourceFile(SourceFile *SF, const AvailabilityContext *Info);
193193

194194
/// Create a refinement context for the given declaration.
195195
static TypeRefinementContext *createForDecl(ASTContext &Ctx, Decl *D,
196196
TypeRefinementContext *Parent,
197-
const AvailabilityRange &Info,
197+
const AvailabilityContext *Info,
198198
SourceRange SrcRange);
199199

200200
/// Create a refinement context for the given declaration.
201201
static TypeRefinementContext *
202202
createForDeclImplicit(ASTContext &Ctx, Decl *D, TypeRefinementContext *Parent,
203-
const AvailabilityRange &Info, SourceRange SrcRange);
203+
const AvailabilityContext *Info, SourceRange SrcRange);
204204

205205
/// Create a refinement context for the Then branch of the given IfStmt.
206206
static TypeRefinementContext *
207207
createForIfStmtThen(ASTContext &Ctx, IfStmt *S, TypeRefinementContext *Parent,
208-
const AvailabilityRange &Info);
208+
const AvailabilityContext *Info);
209209

210210
/// Create a refinement context for the Else branch of the given IfStmt.
211211
static TypeRefinementContext *
212212
createForIfStmtElse(ASTContext &Ctx, IfStmt *S, TypeRefinementContext *Parent,
213-
const AvailabilityRange &Info);
213+
const AvailabilityContext *Info);
214214

215215
/// Create a refinement context for the true-branch control flow to
216216
/// further StmtConditionElements following a #available() query in
@@ -219,24 +219,24 @@ class TypeRefinementContext : public ASTAllocated<TypeRefinementContext> {
219219
createForConditionFollowingQuery(ASTContext &Ctx, PoundAvailableInfo *PAI,
220220
const StmtConditionElement &LastElement,
221221
TypeRefinementContext *Parent,
222-
const AvailabilityRange &Info);
222+
const AvailabilityContext *Info);
223223

224224
/// Create a refinement context for the fallthrough of a GuardStmt.
225225
static TypeRefinementContext *createForGuardStmtFallthrough(
226226
ASTContext &Ctx, GuardStmt *RS, BraceStmt *ContainingBraceStmt,
227-
TypeRefinementContext *Parent, const AvailabilityRange &Info);
227+
TypeRefinementContext *Parent, const AvailabilityContext *Info);
228228

229229
/// Create a refinement context for the else branch of a GuardStmt.
230230
static TypeRefinementContext *
231231
createForGuardStmtElse(ASTContext &Ctx, GuardStmt *RS,
232232
TypeRefinementContext *Parent,
233-
const AvailabilityRange &Info);
233+
const AvailabilityContext *Info);
234234

235235
/// Create a refinement context for the body of a WhileStmt.
236236
static TypeRefinementContext *
237237
createForWhileStmtBody(ASTContext &Ctx, WhileStmt *WS,
238238
TypeRefinementContext *Parent,
239-
const AvailabilityRange &Info);
239+
const AvailabilityContext *Info);
240240

241241
Decl *getDeclOrNull() const {
242242
auto IntroReason = getReason();
@@ -276,12 +276,17 @@ class TypeRefinementContext : public ASTAllocated<TypeRefinementContext> {
276276
/// Returns the source range on which this context refines types.
277277
SourceRange getSourceRange() const { return SrcRange; }
278278

279-
/// Returns the information on what can be assumed present at run time when
280-
/// running code contained in this context.
281-
const AvailabilityRange &getAvailabilityInfo() const {
279+
/// Returns the availability context of code contained in this context.
280+
const AvailabilityContext *getAvailabilityContext() const {
282281
return AvailabilityInfo;
283282
}
284283

284+
/// Returns the platform version range that can be assumed present at run
285+
/// time when running code contained in this context.
286+
const AvailabilityRange getPlatformAvailabilityRange() const {
287+
return AvailabilityInfo->getPlatformRange();
288+
}
289+
285290
/// Adds a child refinement context.
286291
void addChild(TypeRefinementContext *Child, ASTContext &Ctx);
287292

lib/AST/TypeRefinementContext.cpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,26 @@ using namespace swift;
3131
TypeRefinementContext::TypeRefinementContext(ASTContext &Ctx, IntroNode Node,
3232
TypeRefinementContext *Parent,
3333
SourceRange SrcRange,
34-
const AvailabilityRange &Info)
34+
const AvailabilityContext *Info)
3535
: Node(Node), SrcRange(SrcRange), AvailabilityInfo(Info) {
3636
if (Parent) {
3737
assert(SrcRange.isValid());
3838
Parent->addChild(this, Ctx);
39-
assert(Info.isContainedIn(Parent->getAvailabilityInfo()));
39+
assert(Info->getPlatformRange().isContainedIn(
40+
Parent->getPlatformAvailabilityRange()));
4041
}
4142
Ctx.addDestructorCleanup(Children);
4243
}
4344

4445
TypeRefinementContext *
4546
TypeRefinementContext::createForSourceFile(SourceFile *SF,
46-
const AvailabilityRange &Info) {
47+
const AvailabilityContext *Info) {
4748
assert(SF);
4849

4950
ASTContext &Ctx = SF->getASTContext();
5051

5152
SourceRange range;
5253
TypeRefinementContext *parentContext = nullptr;
53-
AvailabilityRange availabilityRange = Info;
5454
switch (SF->Kind) {
5555
case SourceFileKind::MacroExpansion:
5656
case SourceFileKind::DefaultArgument: {
@@ -63,8 +63,6 @@ TypeRefinementContext::createForSourceFile(SourceFile *SF,
6363
auto originalNode = SF->getNodeInEnclosingSourceFile();
6464
parentContext =
6565
parentTRC->findMostRefinedSubContext(originalNode.getStartLoc(), Ctx);
66-
if (parentContext)
67-
availabilityRange = parentContext->getAvailabilityInfo();
6866
}
6967
break;
7068
}
@@ -76,21 +74,22 @@ TypeRefinementContext::createForSourceFile(SourceFile *SF,
7674
llvm_unreachable("unexpected SourceFileKind");
7775
}
7876

79-
return new (Ctx)
80-
TypeRefinementContext(Ctx, SF, parentContext, range, availabilityRange);
77+
return new (Ctx) TypeRefinementContext(
78+
Ctx, SF, parentContext, range,
79+
parentContext ? parentContext->getAvailabilityContext() : Info);
8180
}
8281

8382
TypeRefinementContext *TypeRefinementContext::createForDecl(
8483
ASTContext &Ctx, Decl *D, TypeRefinementContext *Parent,
85-
const AvailabilityRange &Info, SourceRange SrcRange) {
84+
const AvailabilityContext *Info, SourceRange SrcRange) {
8685
assert(D);
8786
assert(Parent);
8887
return new (Ctx) TypeRefinementContext(Ctx, D, Parent, SrcRange, Info);
8988
}
9089

9190
TypeRefinementContext *TypeRefinementContext::createForDeclImplicit(
9291
ASTContext &Ctx, Decl *D, TypeRefinementContext *Parent,
93-
const AvailabilityRange &Info, SourceRange SrcRange) {
92+
const AvailabilityContext *Info, SourceRange SrcRange) {
9493
assert(D);
9594
assert(Parent);
9695
return new (Ctx) TypeRefinementContext(
@@ -100,7 +99,7 @@ TypeRefinementContext *TypeRefinementContext::createForDeclImplicit(
10099
TypeRefinementContext *
101100
TypeRefinementContext::createForIfStmtThen(ASTContext &Ctx, IfStmt *S,
102101
TypeRefinementContext *Parent,
103-
const AvailabilityRange &Info) {
102+
const AvailabilityContext *Info) {
104103
assert(S);
105104
assert(Parent);
106105
return new (Ctx)
@@ -111,7 +110,7 @@ TypeRefinementContext::createForIfStmtThen(ASTContext &Ctx, IfStmt *S,
111110
TypeRefinementContext *
112111
TypeRefinementContext::createForIfStmtElse(ASTContext &Ctx, IfStmt *S,
113112
TypeRefinementContext *Parent,
114-
const AvailabilityRange &Info) {
113+
const AvailabilityContext *Info) {
115114
assert(S);
116115
assert(Parent);
117116
return new (Ctx)
@@ -122,7 +121,7 @@ TypeRefinementContext::createForIfStmtElse(ASTContext &Ctx, IfStmt *S,
122121
TypeRefinementContext *TypeRefinementContext::createForConditionFollowingQuery(
123122
ASTContext &Ctx, PoundAvailableInfo *PAI,
124123
const StmtConditionElement &LastElement, TypeRefinementContext *Parent,
125-
const AvailabilityRange &Info) {
124+
const AvailabilityContext *Info) {
126125
assert(PAI);
127126
assert(Parent);
128127
SourceRange Range(PAI->getEndLoc(), LastElement.getEndLoc());
@@ -131,7 +130,7 @@ TypeRefinementContext *TypeRefinementContext::createForConditionFollowingQuery(
131130

132131
TypeRefinementContext *TypeRefinementContext::createForGuardStmtFallthrough(
133132
ASTContext &Ctx, GuardStmt *RS, BraceStmt *ContainingBraceStmt,
134-
TypeRefinementContext *Parent, const AvailabilityRange &Info) {
133+
TypeRefinementContext *Parent, const AvailabilityContext *Info) {
135134
assert(RS);
136135
assert(ContainingBraceStmt);
137136
assert(Parent);
@@ -143,7 +142,7 @@ TypeRefinementContext *TypeRefinementContext::createForGuardStmtFallthrough(
143142
TypeRefinementContext *
144143
TypeRefinementContext::createForGuardStmtElse(ASTContext &Ctx, GuardStmt *RS,
145144
TypeRefinementContext *Parent,
146-
const AvailabilityRange &Info) {
145+
const AvailabilityContext *Info) {
147146
assert(RS);
148147
assert(Parent);
149148
return new (Ctx)
@@ -154,7 +153,7 @@ TypeRefinementContext::createForGuardStmtElse(ASTContext &Ctx, GuardStmt *RS,
154153
TypeRefinementContext *
155154
TypeRefinementContext::createForWhileStmtBody(ASTContext &Ctx, WhileStmt *S,
156155
TypeRefinementContext *Parent,
157-
const AvailabilityRange &Info) {
156+
const AvailabilityContext *Info) {
158157
assert(S);
159158
assert(Parent);
160159
return new (Ctx) TypeRefinementContext(Ctx, S, Parent,
@@ -380,7 +379,7 @@ TypeRefinementContext::getExplicitAvailabilityRange() const {
380379
case Reason::GuardStmtElseBranch:
381380
case Reason::WhileStmtBody:
382381
// Availability is inherently explicit for all of these nodes.
383-
return getAvailabilityInfo();
382+
return getPlatformAvailabilityRange();
384383
}
385384

386385
llvm_unreachable("Unhandled Reason in switch.");
@@ -401,7 +400,7 @@ void TypeRefinementContext::print(raw_ostream &OS, SourceManager &SrcMgr,
401400
OS.indent(Indent);
402401
OS << "(" << getReasonName(getReason());
403402

404-
OS << " version=" << stringForAvailability(AvailabilityInfo);
403+
OS << " version=" << stringForAvailability(getPlatformAvailabilityRange());
405404

406405
if (getReason() == Reason::Decl || getReason() == Reason::DeclImplicit) {
407406
Decl *D = Node.getAsDecl();
@@ -582,7 +581,8 @@ void TypeRefinementContext::verify(const TypeRefinementContext *parent,
582581
{{"child", this}, {"parent", parent}});
583582
}
584583

585-
if (!AvailabilityInfo.isContainedIn(parent->AvailabilityInfo))
584+
if (!getPlatformAvailabilityRange().isContainedIn(
585+
parent->getPlatformAvailabilityRange()))
586586
verificationError(ctx, "child availability range not contained",
587587
{{"child", this}, {"parent", parent}});
588588
}

0 commit comments

Comments
 (0)