Skip to content

Commit f6b7301

Browse files
authored
Merge pull request #70591 from hamishknight/doritos-and-fritos
[AST] A couple of PatternBindingInitializer cleanups
2 parents ab03e1f + 0b18d28 commit f6b7301

21 files changed

+101
-190
lines changed

include/swift/AST/Decl.h

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "swift/AST/GenericParamKey.h"
3232
#include "swift/AST/IfConfigClause.h"
3333
#include "swift/AST/Import.h"
34+
#include "swift/AST/Initializer.h"
3435
#include "swift/AST/LayoutConstraint.h"
3536
#include "swift/AST/LifetimeAnnotation.h"
3637
#include "swift/AST/ReferenceCounting.h"
@@ -1966,7 +1967,7 @@ class PatternBindingEntry {
19661967
IsFromDebugger = 1 << 2,
19671968
};
19681969
/// The initializer context used for this pattern binding entry.
1969-
llvm::PointerIntPair<DeclContext *, 3, OptionSet<PatternFlags>>
1970+
llvm::PointerIntPair<PatternBindingInitializer *, 3, OptionSet<PatternFlags>>
19701971
InitContextAndFlags;
19711972

19721973
/// Values captured by this initializer.
@@ -2007,7 +2008,7 @@ class PatternBindingEntry {
20072008
public:
20082009
/// \p E is the initializer as parsed.
20092010
PatternBindingEntry(Pattern *P, SourceLoc EqualLoc, Expr *E,
2010-
DeclContext *InitContext)
2011+
PatternBindingInitializer *InitContext)
20112012
: PatternAndFlags(P, {}),
20122013
InitExpr({E, {E, InitializerStatus::NotChecked}, EqualLoc}),
20132014
InitContextAndFlags({InitContext, llvm::None}) {}
@@ -2111,12 +2112,14 @@ class PatternBindingEntry {
21112112
VarDecl *getAnchoringVarDecl() const;
21122113

21132114
// Retrieve the declaration context for the initializer.
2114-
DeclContext *getInitContext() const {
2115+
PatternBindingInitializer *getInitContext() const {
21152116
return InitContextAndFlags.getPointer();
21162117
}
21172118

21182119
/// Override the initializer context.
2119-
void setInitContext(DeclContext *dc) { InitContextAndFlags.setPointer(dc); }
2120+
void setInitContext(PatternBindingInitializer *init) {
2121+
InitContextAndFlags.setPointer(init);
2122+
}
21202123

21212124
SourceLoc getStartLoc() const;
21222125

@@ -2314,18 +2317,24 @@ class PatternBindingDecl final : public Decl,
23142317
Pattern *getPattern(unsigned i) const {
23152318
return getPatternList()[i].getPattern();
23162319
}
2317-
2318-
void setPattern(unsigned i, Pattern *Pat, DeclContext *InitContext,
2319-
bool isFullyValidated = false);
2320+
2321+
void setPattern(unsigned i, Pattern *P, bool isFullyValidated = false);
23202322

23212323
bool isFullyValidated(unsigned i) const {
23222324
return getPatternList()[i].isFullyValidated();
23232325
}
23242326

2325-
DeclContext *getInitContext(unsigned i) const {
2327+
PatternBindingInitializer *getInitContext(unsigned i) const {
23262328
return getPatternList()[i].getInitContext();
23272329
}
23282330

2331+
void setInitContext(unsigned i, PatternBindingInitializer *init) {
2332+
if (init) {
2333+
init->setBinding(this, i);
2334+
}
2335+
getMutablePatternList()[i].setInitContext(init);
2336+
}
2337+
23292338
CaptureInfo getCaptureInfo(unsigned i) const {
23302339
return getPatternList()[i].getCaptureInfo();
23312340
}

include/swift/AST/DeclContext.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ namespace swift {
7979
class Initializer;
8080
class ClassDecl;
8181
class SerializedAbstractClosureExpr;
82-
class SerializedPatternBindingInitializer;
83-
class SerializedDefaultArgumentInitializer;
8482
class SerializedTopLevelCodeDecl;
8583
class StructDecl;
8684
class AccessorDecl;
@@ -115,8 +113,6 @@ enum class DeclContextKind : unsigned {
115113
/// \see SerializedLocalDeclContext.
116114
enum class LocalDeclContextKind : uint8_t {
117115
AbstractClosure,
118-
PatternBindingInitializer,
119-
DefaultArgumentInitializer,
120116
TopLevelCodeDecl
121117
};
122118

include/swift/AST/Initializer.h

Lines changed: 11 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
#define SWIFT_INITIALIZER_H
2222

2323
#include "swift/AST/DeclContext.h"
24-
#include "swift/AST/Decl.h"
2524

2625
namespace swift {
26+
class ParamDecl;
2727
class PatternBindingDecl;
2828

2929
enum class InitializerKind : uint8_t {
@@ -76,28 +76,25 @@ class PatternBindingInitializer : public Initializer {
7676
// created lazily for 'self' lookup from lazy property initializer
7777
ParamDecl *SelfParam;
7878

79-
friend class ASTContext; // calls reset on unused contexts
79+
// Sets itself as the parent.
80+
friend class PatternBindingDecl;
8081

81-
void reset(DeclContext *parent) {
82-
setParent(parent);
83-
Binding = nullptr;
84-
SelfParam = nullptr;
85-
}
82+
void setBinding(PatternBindingDecl *binding, unsigned bindingIndex);
8683

87-
public:
8884
explicit PatternBindingInitializer(DeclContext *parent)
8985
: Initializer(InitializerKind::PatternBinding, parent),
9086
Binding(nullptr), SelfParam(nullptr) {
9187
SpareBits = 0;
9288
}
93-
9489

95-
void setBinding(PatternBindingDecl *binding, unsigned bindingIndex) {
96-
setParent(binding->getDeclContext());
97-
Binding = binding;
98-
SpareBits = bindingIndex;
90+
public:
91+
static PatternBindingInitializer *create(DeclContext *parent) {
92+
return new (parent->getASTContext()) PatternBindingInitializer(parent);
9993
}
100-
94+
95+
static PatternBindingInitializer *createDeserialized(PatternBindingDecl *PBD,
96+
unsigned index);
97+
10198
PatternBindingDecl *getBinding() const { return Binding; }
10299

103100
unsigned getBindingIndex() const { return SpareBits; }
@@ -119,37 +116,6 @@ class PatternBindingInitializer : public Initializer {
119116
}
120117
};
121118

122-
/// SerializedPatternBindingInitializer - This represents what was originally a
123-
/// PatternBindingInitializer during serialization. It is preserved as a special
124-
/// class only to maintain the correct AST structure and remangling after
125-
/// deserialization.
126-
class SerializedPatternBindingInitializer : public SerializedLocalDeclContext {
127-
PatternBindingDecl *Binding;
128-
129-
public:
130-
SerializedPatternBindingInitializer(PatternBindingDecl *Binding,
131-
unsigned bindingIndex)
132-
: SerializedLocalDeclContext(LocalDeclContextKind::PatternBindingInitializer,
133-
Binding->getDeclContext()),
134-
Binding(Binding) {
135-
SpareBits = bindingIndex;
136-
}
137-
138-
PatternBindingDecl *getBinding() const {
139-
return Binding;
140-
}
141-
142-
unsigned getBindingIndex() const { return SpareBits; }
143-
144-
145-
static bool classof(const DeclContext *DC) {
146-
if (auto LDC = dyn_cast<SerializedLocalDeclContext>(DC))
147-
return LDC->getLocalDeclContextKind() ==
148-
LocalDeclContextKind::PatternBindingInitializer;
149-
return false;
150-
}
151-
};
152-
153119
/// A default argument expression. The parent context is the function
154120
/// (possibly a closure) for which this is a default argument.
155121
class DefaultArgumentInitializer : public Initializer {
@@ -176,29 +142,6 @@ class DefaultArgumentInitializer : public Initializer {
176142
}
177143
};
178144

179-
/// SerializedDefaultArgumentInitializer - This represents what was originally a
180-
/// DefaultArgumentInitializer during serialization. It is preserved only to
181-
/// maintain the correct AST structure and remangling after deserialization.
182-
class SerializedDefaultArgumentInitializer : public SerializedLocalDeclContext {
183-
const unsigned Index;
184-
public:
185-
SerializedDefaultArgumentInitializer(unsigned Index, DeclContext *Parent)
186-
: SerializedLocalDeclContext(LocalDeclContextKind::DefaultArgumentInitializer,
187-
Parent),
188-
Index(Index) {}
189-
190-
unsigned getIndex() const {
191-
return Index;
192-
}
193-
194-
static bool classof(const DeclContext *DC) {
195-
if (auto LDC = dyn_cast<SerializedLocalDeclContext>(DC))
196-
return LDC->getLocalDeclContextKind() ==
197-
LocalDeclContextKind::DefaultArgumentInitializer;
198-
return false;
199-
}
200-
};
201-
202145
/// A property wrapper initialization expression. The parent context is the
203146
/// function or closure which owns the property wrapper.
204147
class PropertyWrapperInitializer : public Initializer {

include/swift/Sema/SyntacticElementTarget.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ class SyntacticElementTarget {
254254
/// Form a target for the initialization of a pattern binding entry from
255255
/// an expression.
256256
static SyntacticElementTarget
257-
forInitialization(Expr *initializer, DeclContext *dc, Type patternType,
257+
forInitialization(Expr *initializer, Type patternType,
258258
PatternBindingDecl *patternBinding,
259259
unsigned patternBindingIndex, bool bindPatternVarsOneWay);
260260

lib/AST/ASTBridging.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,7 @@ bool BridgedDeclContext_isLocalContext(BridgedDeclContext cDeclContext) {
343343

344344
BridgedPatternBindingInitializer
345345
BridgedPatternBindingInitializer_create(BridgedDeclContext cDeclContext) {
346-
auto *dc = cDeclContext.unbridged();
347-
return new (dc->getASTContext()) PatternBindingInitializer(dc);
346+
return PatternBindingInitializer::create(cDeclContext.unbridged());
348347
}
349348

350349
BridgedDeclContext BridgedPatternBindingInitializer_asDeclContext(

lib/AST/ASTMangler.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2323,22 +2323,6 @@ void ASTMangler::appendContext(const DeclContext *ctx, StringRef useModuleName)
23232323
case LocalDeclContextKind::AbstractClosure:
23242324
appendClosureEntity(cast<SerializedAbstractClosureExpr>(local));
23252325
return;
2326-
case LocalDeclContextKind::DefaultArgumentInitializer: {
2327-
auto argInit = cast<SerializedDefaultArgumentInitializer>(local);
2328-
appendDefaultArgumentEntity(ctx->getParent(), argInit->getIndex());
2329-
return;
2330-
}
2331-
case LocalDeclContextKind::PatternBindingInitializer: {
2332-
auto patternInit = cast<SerializedPatternBindingInitializer>(local);
2333-
if (auto var = findFirstVariable(patternInit->getBinding())) {
2334-
appendInitializerEntity(var.value());
2335-
} else {
2336-
// This is incorrect in that it does not produce a /unique/ mangling,
2337-
// but it will at least produce a /valid/ mangling.
2338-
appendContext(ctx->getParent(), useModuleName);
2339-
}
2340-
return;
2341-
}
23422326
case LocalDeclContextKind::TopLevelCodeDecl:
23432327
return appendContext(local->getParent(), useModuleName);
23442328
}

lib/AST/ASTScopeLookup.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -437,9 +437,7 @@ bool BraceStmtScope::lookupLocalsOrMembers(DeclConsumer consumer) const {
437437
bool PatternEntryInitializerScope::lookupLocalsOrMembers(
438438
DeclConsumer consumer) const {
439439
// 'self' is available within the pattern initializer of a 'lazy' variable.
440-
auto *initContext = dyn_cast_or_null<PatternBindingInitializer>(
441-
decl->getInitContext(0));
442-
if (initContext) {
440+
if (auto *initContext = decl->getInitContext(0)) {
443441
if (auto *selfParam = initContext->getImplicitSelfDecl()) {
444442
return consumer.consume({selfParam});
445443
}

lib/AST/ASTWalker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
202202

203203
for (auto idx : range(PBD->getNumPatternEntries())) {
204204
if (Pattern *Pat = doIt(PBD->getPattern(idx)))
205-
PBD->setPattern(idx, Pat, PBD->getInitContext(idx));
205+
PBD->setPattern(idx, Pat);
206206
else
207207
return true;
208208

lib/AST/Decl.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,21 +1925,19 @@ PatternBindingDecl::create(ASTContext &Ctx, SourceLoc StaticLoc,
19251925
PBD->getTrailingObjects<PatternBindingEntry>());
19261926

19271927
for (auto idx : range(PBD->getNumPatternEntries())) {
1928-
auto *initContext =
1929-
cast_or_null<PatternBindingInitializer>(PBD->getInitContext(idx));
1928+
auto *initContext = PBD->getInitContext(idx);
19301929

19311930
// FIXME: We ought to reconsider this since it won't recontextualize any
19321931
// closures/decls present in the initialization expr. This currently should
19331932
// only affect implicit code though.
19341933
if (!initContext && !Parent->isLocalContext())
1935-
initContext = new (Ctx) PatternBindingInitializer(Parent);
1936-
1937-
if (initContext)
1938-
initContext->setBinding(PBD, idx);
1934+
initContext = PatternBindingInitializer::create(Parent);
19391935

19401936
// We need to call setPattern to ensure the VarDecls in the pattern have
1941-
// the PatternBindingDecl set as their parent, and to setup the context.
1942-
PBD->setPattern(idx, PBD->getPattern(idx), initContext);
1937+
// the PatternBindingDecl set as their parent. We also need to call
1938+
// setInitContext to setup the context.
1939+
PBD->setPattern(idx, PBD->getPattern(idx));
1940+
PBD->setInitContext(idx, initContext);
19431941
}
19441942
return PBD;
19451943
}
@@ -1962,6 +1960,14 @@ PatternBindingDecl *PatternBindingDecl::createDeserialized(
19621960
return PBD;
19631961
}
19641962

1963+
PatternBindingInitializer *
1964+
PatternBindingInitializer::createDeserialized(PatternBindingDecl *PBD,
1965+
unsigned index) {
1966+
auto *init = PatternBindingInitializer::create(PBD->getDeclContext());
1967+
init->setBinding(PBD, index);
1968+
return init;
1969+
}
1970+
19651971
ParamDecl *PatternBindingInitializer::getImplicitSelfDecl() const {
19661972
if (SelfParam)
19671973
return SelfParam;
@@ -1997,6 +2003,18 @@ ParamDecl *PatternBindingInitializer::getImplicitSelfDecl() const {
19972003
return SelfParam;
19982004
}
19992005

2006+
void PatternBindingInitializer::setBinding(PatternBindingDecl *binding,
2007+
unsigned bindingIndex) {
2008+
assert(binding);
2009+
assert(!Binding || Binding == binding &&
2010+
"Cannot change the binding after the fact");
2011+
assert(!Binding || SpareBits == bindingIndex &&
2012+
"Cannot change the binding index after the fact");
2013+
setParent(binding->getDeclContext());
2014+
Binding = binding;
2015+
SpareBits = bindingIndex;
2016+
}
2017+
20002018
VarDecl *PatternBindingInitializer::getInitializedLazyVar() const {
20012019
if (auto binding = getBinding()) {
20022020
if (auto var = binding->getSingleVar()) {
@@ -2225,12 +2243,10 @@ PatternBindingDecl::getCheckedPatternBindingEntry(unsigned i) const {
22252243
}
22262244

22272245
void PatternBindingDecl::setPattern(unsigned i, Pattern *P,
2228-
DeclContext *InitContext,
22292246
bool isFullyValidated) {
22302247
auto PatternList = getMutablePatternList();
22312248
PatternList[i].setPattern(P);
2232-
PatternList[i].setInitContext(InitContext);
2233-
2249+
22342250
// Make sure that any VarDecl's contained within the pattern know about this
22352251
// PatternBindingDecl as their parent.
22362252
if (P) {
@@ -2244,7 +2260,6 @@ void PatternBindingDecl::setPattern(unsigned i, Pattern *P,
22442260
}
22452261
}
22462262

2247-
22482263
VarDecl *PatternBindingDecl::getSingleVar() const {
22492264
if (getNumPatternEntries() == 1)
22502265
return getPatternList()[0].getPattern()->getSingleVar();

lib/AST/DeclContext.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -824,17 +824,6 @@ unsigned DeclContext::printContext(raw_ostream &OS, const unsigned indent,
824824
OS << " closure : " << serializedClosure->getType();
825825
break;
826826
}
827-
case LocalDeclContextKind::DefaultArgumentInitializer: {
828-
auto init = cast<SerializedDefaultArgumentInitializer>(local);
829-
OS << "DefaultArgument index=" << init->getIndex();
830-
break;
831-
}
832-
case LocalDeclContextKind::PatternBindingInitializer: {
833-
auto init = cast<SerializedPatternBindingInitializer>(local);
834-
OS << " PatternBinding 0x" << (void*) init->getBinding()
835-
<< " #" << init->getBindingIndex();
836-
break;
837-
}
838827
case LocalDeclContextKind::TopLevelCodeDecl:
839828
OS << " TopLevelCode";
840829
break;

0 commit comments

Comments
 (0)