Skip to content

Commit 10291e0

Browse files
committed
Make AbstractClosureExpr a DeclContext
(remove DeclContext base class from PipeClosureExpr and ImplicitClosureExpr) Swift SVN r8303
1 parent 4a37757 commit 10291e0

File tree

17 files changed

+63
-81
lines changed

17 files changed

+63
-81
lines changed

include/swift/AST/DeclContext.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
//===----------------------------------------------------------------------===//
1212
//
1313
// This file defines the DeclContext class. A DeclContext is the semantic
14-
// construct that a declaration belongs to, such as the enclosing ClosureExpr
15-
// or declaration.
14+
// construct that a declaration belongs to, such as the enclosing
15+
// AbstractClosureExpr or declaration.
1616
//
1717
//===----------------------------------------------------------------------===//
1818

@@ -52,8 +52,7 @@ namespace swift {
5252
// allows for range checks in classof.
5353
enum class DeclContextKind : uint8_t {
5454
Module,
55-
PipeClosureExpr,
56-
ClosureExpr,
55+
AbstractClosureExpr,
5756
NominalTypeDecl,
5857
ExtensionDecl,
5958
TopLevelCodeDecl,
@@ -100,8 +99,7 @@ class alignas(8) DeclContext {
10099
/// code block. A context that appears in such a scope, like a
101100
/// local type declaration, does not itself become a local context.
102101
bool isLocalContext() const {
103-
return getContextKind() == DeclContextKind::PipeClosureExpr ||
104-
getContextKind() == DeclContextKind::ClosureExpr ||
102+
return getContextKind() == DeclContextKind::AbstractClosureExpr ||
105103
getContextKind() == DeclContextKind::TopLevelCodeDecl ||
106104
getContextKind() == DeclContextKind::AbstractFunctionDecl;
107105
}

include/swift/AST/Expr.h

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,12 +1612,13 @@ class SequenceExpr : public Expr {
16121612
};
16131613

16141614
/// \brief A base class for closure expressions.
1615-
class AbstractClosureExpr : public Expr {
1615+
class AbstractClosureExpr : public Expr, public DeclContext {
16161616
CaptureInfo Captures;
16171617

16181618
public:
1619-
AbstractClosureExpr(ExprKind Kind, Type FnType)
1620-
: Expr(Kind, FnType)
1619+
AbstractClosureExpr(ExprKind Kind, Type FnType, DeclContext *Parent)
1620+
: Expr(Kind, FnType),
1621+
DeclContext(DeclContextKind::AbstractClosureExpr, Parent)
16211622
{}
16221623

16231624
CaptureInfo &getCaptureInfo() { return Captures; }
@@ -1627,12 +1628,18 @@ class AbstractClosureExpr : public Expr {
16271628
return E->getKind() >= ExprKind::First_AbstractClosureExpr &&
16281629
E->getKind() <= ExprKind::Last_AbstractClosureExpr;
16291630
}
1631+
1632+
static bool classof(const DeclContext *DC) {
1633+
return DC->getContextKind() == DeclContextKind::AbstractClosureExpr;
1634+
}
1635+
1636+
using DeclContext::operator new;
16301637
};
16311638

16321639
/// An explicit unnamed func definition, which can optionally
16331640
/// have named arguments.
16341641
/// e.g. func(a : int) -> int { return a+1 }
1635-
class PipeClosureExpr : public AbstractClosureExpr, public DeclContext {
1642+
class PipeClosureExpr : public AbstractClosureExpr {
16361643
/// \brief The set of parameters, along with a bit indicating when these
16371644
/// parameters were synthesized from anonymous closure variables.
16381645
llvm::PointerIntPair<Pattern *, 1, bool> params;
@@ -1650,9 +1657,8 @@ class PipeClosureExpr : public AbstractClosureExpr, public DeclContext {
16501657

16511658
public:
16521659
PipeClosureExpr(Pattern *params, SourceLoc arrowLoc,
1653-
TypeLoc explicitResultType, DeclContext *parent)
1654-
: AbstractClosureExpr(ExprKind::PipeClosure, Type()),
1655-
DeclContext(DeclContextKind::PipeClosureExpr, parent),
1660+
TypeLoc explicitResultType, DeclContext *Parent)
1661+
: AbstractClosureExpr(ExprKind::PipeClosure, Type(), Parent),
16561662
params(params, false), arrowLoc(arrowLoc),
16571663
explicitResultType(explicitResultType), body(nullptr) { }
16581664

@@ -1738,14 +1744,6 @@ class PipeClosureExpr : public AbstractClosureExpr, public DeclContext {
17381744
static bool classof(const Expr *E) {
17391745
return E->getKind() == ExprKind::PipeClosure;
17401746
}
1741-
static bool classof(const AbstractClosureExpr *E) {
1742-
return classof(cast<Expr>(E));
1743-
}
1744-
static bool classof(const DeclContext *DC) {
1745-
return DC->getContextKind() == DeclContextKind::PipeClosureExpr;
1746-
}
1747-
1748-
using DeclContext::operator new;
17491747
};
17501748

17511749
/// \brief This is a closure of the contained subexpression that is formed
@@ -1754,14 +1752,13 @@ class PipeClosureExpr : public AbstractClosureExpr, public DeclContext {
17541752
/// \code
17551753
/// var x : [auto_closure] () -> int = 4
17561754
/// \endcode
1757-
class ImplicitClosureExpr : public AbstractClosureExpr, public DeclContext {
1755+
class ImplicitClosureExpr : public AbstractClosureExpr {
17581756
BraceStmt *Body;
17591757
Pattern *ParamPattern;
17601758

17611759
public:
1762-
ImplicitClosureExpr(Expr *Body, DeclContext *Parent, Type ResultTy)
1763-
: AbstractClosureExpr(ExprKind::ImplicitClosure, ResultTy),
1764-
DeclContext(DeclContextKind::ClosureExpr, Parent),
1760+
ImplicitClosureExpr(Expr *Body, Type ResultTy, DeclContext *Parent)
1761+
: AbstractClosureExpr(ExprKind::ImplicitClosure, ResultTy, Parent),
17651762
ParamPattern(nullptr) {
17661763
setBody(Body);
17671764
}
@@ -1788,11 +1785,6 @@ class ImplicitClosureExpr : public AbstractClosureExpr, public DeclContext {
17881785
static bool classof(const Expr *E) {
17891786
return E->getKind() == ExprKind::ImplicitClosure;
17901787
}
1791-
static bool classof(const DeclContext *DC) {
1792-
return DC->getContextKind() == DeclContextKind::ClosureExpr;
1793-
}
1794-
1795-
using DeclContext::operator new;
17961788
};
17971789

17981790
/// NewArrayExpr - The allocation of an array. Allocates and constructs

lib/AST/ASTDumper.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -579,13 +579,14 @@ static void printContext(raw_ostream &os, DeclContext *dc) {
579579
printName(os, cast<Module>(dc)->Name);
580580
break;
581581

582-
case DeclContextKind::PipeClosureExpr:
583-
os << "pipe closure";
584-
break;
585-
586-
case DeclContextKind::ClosureExpr:
587-
os << "closure";
582+
case DeclContextKind::AbstractClosureExpr: {
583+
auto *ACE = cast<AbstractClosureExpr>(dc);
584+
if (isa<PipeClosureExpr>(ACE))
585+
os << "pipe closure";
586+
if (isa<ImplicitClosureExpr>(ACE))
587+
os << "auto_closure";
588588
break;
589+
}
589590

590591
case DeclContextKind::NominalTypeDecl:
591592
printName(os, cast<NominalTypeDecl>(dc)->getName());
@@ -606,7 +607,7 @@ static void printContext(raw_ostream &os, DeclContext *dc) {
606607
break;
607608

608609
case DeclContextKind::AbstractFunctionDecl: {
609-
auto *AFD = dyn_cast<AbstractFunctionDecl>(dc);
610+
auto *AFD = cast<AbstractFunctionDecl>(dc);
610611
if (isa<FuncDecl>(AFD))
611612
os << "func decl";
612613
if (isa<ConstructorDecl>(AFD))

lib/AST/Attr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ Resilience ValueDecl::getResilienceFrom(Component *C) const {
6666
assert(0 && "All cases should be covered");
6767

6868
// Local declarations are always inherently fragile.
69-
case DeclContextKind::PipeClosureExpr:
70-
case DeclContextKind::ClosureExpr:
69+
case DeclContextKind::AbstractClosureExpr:
7170
case DeclContextKind::TopLevelCodeDecl:
7271
case DeclContextKind::AbstractFunctionDecl:
7372
return Resilience::InherentlyFragile;

lib/AST/DeclContext.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ ASTContext &DeclContext::getASTContext() {
3333
Type DeclContext::getDeclaredTypeOfContext() const {
3434
switch (getContextKind()) {
3535
case DeclContextKind::Module:
36-
case DeclContextKind::PipeClosureExpr:
37-
case DeclContextKind::ClosureExpr:
36+
case DeclContextKind::AbstractClosureExpr:
3837
case DeclContextKind::TopLevelCodeDecl:
3938
case DeclContextKind::AbstractFunctionDecl:
4039
return Type();
@@ -52,8 +51,7 @@ Type DeclContext::getDeclaredTypeOfContext() const {
5251
Type DeclContext::getDeclaredTypeInContext() {
5352
switch (getContextKind()) {
5453
case DeclContextKind::Module:
55-
case DeclContextKind::PipeClosureExpr:
56-
case DeclContextKind::ClosureExpr:
54+
case DeclContextKind::AbstractClosureExpr:
5755
case DeclContextKind::TopLevelCodeDecl:
5856
case DeclContextKind::AbstractFunctionDecl:
5957
return Type();
@@ -72,8 +70,7 @@ GenericParamList *DeclContext::getGenericParamsOfContext() const {
7270
case DeclContextKind::TopLevelCodeDecl:
7371
return nullptr;
7472

75-
case DeclContextKind::PipeClosureExpr:
76-
case DeclContextKind::ClosureExpr:
73+
case DeclContextKind::AbstractClosureExpr:
7774
return nullptr;
7875

7976
case DeclContextKind::AbstractFunctionDecl: {
@@ -123,8 +120,7 @@ bool DeclContext::isGenericContext() const {
123120
case DeclContextKind::Module:
124121
return false;
125122

126-
case DeclContextKind::PipeClosureExpr:
127-
case DeclContextKind::ClosureExpr:
123+
case DeclContextKind::AbstractClosureExpr:
128124
// Check parent context.
129125
break;
130126

@@ -157,8 +153,9 @@ unsigned DeclContext::printContext(raw_ostream &OS) const {
157153
const char *Kind;
158154
switch (getContextKind()) {
159155
case DeclContextKind::Module: Kind = "Module"; break;
160-
case DeclContextKind::PipeClosureExpr: Kind = "PipeClosureExpr"; break;
161-
case DeclContextKind::ClosureExpr: Kind = "ClosureExpr"; break;
156+
case DeclContextKind::AbstractClosureExpr:
157+
Kind = "AbstractClosureExpr";
158+
break;
162159
case DeclContextKind::NominalTypeDecl: Kind = "NominalTypeDecl"; break;
163160
case DeclContextKind::ExtensionDecl: Kind = "ExtensionDecl"; break;
164161
case DeclContextKind::TopLevelCodeDecl: Kind = "TopLevelCodeDecl"; break;
@@ -171,10 +168,7 @@ unsigned DeclContext::printContext(raw_ostream &OS) const {
171168
if (auto *NTD = dyn_cast<NominalTypeDecl>(this))
172169
OS << " decl=" << NTD->getName();
173170

174-
if (auto *CE = dyn_cast<PipeClosureExpr>(this)) {
175-
OS << ": " << CE->getType().getString();
176-
}
177-
if (auto *CE = dyn_cast<ImplicitClosureExpr>(this)) {
171+
if (auto *CE = dyn_cast<AbstractClosureExpr>(this)) {
178172
OS << ": " << CE->getType().getString();
179173
}
180174
if (auto *AFD = dyn_cast<AbstractFunctionDecl>(this)) {

lib/AST/DiagnosticEngine.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,7 @@ void DiagnosticEngine::flushActiveDiagnostic() {
357357
ppDecl = cast<NominalTypeDecl>(dc);
358358
break;
359359

360-
case DeclContextKind::PipeClosureExpr:
361-
case DeclContextKind::ClosureExpr:
360+
case DeclContextKind::AbstractClosureExpr:
362361
case DeclContextKind::AbstractFunctionDecl:
363362
break;
364363
}

lib/AST/LookupVisibleDecls.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,9 +437,10 @@ void swift::lookupVisibleDecls(VisibleDeclConsumer &Consumer,
437437

438438
// Look in the generic parameters after checking our local declaration.
439439
GenericParams = AFD->getGenericParams();
440-
} else if (auto CE = dyn_cast<PipeClosureExpr>(DC)) {
440+
} else if (auto ACE = dyn_cast<AbstractClosureExpr>(DC)) {
441441
if (Loc.isValid()) {
442-
FindLocalVal(SM, Loc, Consumer).visit(CE->getBody());
442+
if (auto CE = cast<PipeClosureExpr>(ACE))
443+
FindLocalVal(SM, Loc, Consumer).visit(CE->getBody());
443444
}
444445
} else if (auto ED = dyn_cast<ExtensionDecl>(DC)) {
445446
ExtendedType = ED->getExtendedType();

lib/AST/NameLookup.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -327,18 +327,20 @@ UnqualifiedLookup::UnqualifiedLookup(Identifier Name, DeclContext *DC,
327327

328328
// Look in the generic parameters after checking our local declaration.
329329
GenericParams = AFD->getGenericParams();
330-
} else if (PipeClosureExpr *CE = dyn_cast<PipeClosureExpr>(DC)) {
330+
} else if (auto *ACE = dyn_cast<AbstractClosureExpr>(DC)) {
331331
// Look for local variables; normally, the parser resolves these
332332
// for us, but it can't do the right thing inside local types.
333333
if (Loc.isValid()) {
334-
FindLocalVal localVal(SM, Loc, Name);
335-
localVal.visit(CE->getBody());
336-
if (!localVal.MatchingValue) {
337-
localVal.checkPattern(CE->getParams());
338-
}
339-
if (localVal.MatchingValue) {
340-
Results.push_back(Result::getLocalDecl(localVal.MatchingValue));
341-
return;
334+
if (auto *CE = dyn_cast<PipeClosureExpr>(ACE)) {
335+
FindLocalVal localVal(SM, Loc, Name);
336+
localVal.visit(CE->getBody());
337+
if (!localVal.MatchingValue) {
338+
localVal.checkPattern(CE->getParams());
339+
}
340+
if (localVal.MatchingValue) {
341+
Results.push_back(Result::getLocalDecl(localVal.MatchingValue));
342+
return;
343+
}
342344
}
343345
}
344346
} else if (ExtensionDecl *ED = dyn_cast<ExtensionDecl>(DC)) {

lib/IDE/CodeCompletion.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,8 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks,
362362
/// \returns true on success, false on failure.
363363
bool typecheckContext() {
364364
// Type check the function that contains the expression.
365-
if (CurDeclContext->getContextKind() == DeclContextKind::PipeClosureExpr ||
366-
CurDeclContext->getContextKind() == DeclContextKind::ClosureExpr ||
365+
if (CurDeclContext->getContextKind() ==
366+
DeclContextKind::AbstractClosureExpr ||
367367
CurDeclContext->getContextKind() ==
368368
DeclContextKind::AbstractFunctionDecl) {
369369
SourceLoc EndTypeCheckLoc =

lib/IRGen/GenDecl.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,8 +1231,7 @@ static AbstractCC addOwnerArgument(ASTContext &ctx, ValueDecl *value,
12311231
DeclContext *DC = value->getDeclContext();
12321232
switch (DC->getContextKind()) {
12331233
case DeclContextKind::Module:
1234-
case DeclContextKind::PipeClosureExpr:
1235-
case DeclContextKind::ClosureExpr:
1234+
case DeclContextKind::AbstractClosureExpr:
12361235
case DeclContextKind::TopLevelCodeDecl:
12371236
case DeclContextKind::AbstractFunctionDecl:
12381237
return AbstractCC::Freestanding;

0 commit comments

Comments
 (0)