Skip to content

Commit 8320249

Browse files
committed
[AST] Tighten up type of InitContext
Switch from promising a DeclContext to a PatternBindingInitializer. This has a couple of benefits: - It eliminates a few places where we were force `cast`'ing to PatternBindingInitializer. - It improves the clarity of what's being stored, it's not whatever the parent context of the initializer is, it's specifically the PatternBindingInitializer context if it exists.
1 parent d84cb53 commit 8320249

File tree

8 files changed

+32
-38
lines changed

8 files changed

+32
-38
lines changed

include/swift/AST/Decl.h

Lines changed: 11 additions & 7 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,15 +2317,16 @@ 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,
2320+
2321+
void setPattern(unsigned i, Pattern *Pat,
2322+
PatternBindingInitializer *InitContext,
23192323
bool isFullyValidated = false);
23202324

23212325
bool isFullyValidated(unsigned i) const {
23222326
return getPatternList()[i].isFullyValidated();
23232327
}
23242328

2325-
DeclContext *getInitContext(unsigned i) const {
2329+
PatternBindingInitializer *getInitContext(unsigned i) const {
23262330
return getPatternList()[i].getInitContext();
23272331
}
23282332

include/swift/AST/Initializer.h

Lines changed: 3 additions & 7 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 {
@@ -90,12 +90,8 @@ class PatternBindingInitializer : public Initializer {
9090
static PatternBindingInitializer *createDeserialized(PatternBindingDecl *PBD,
9191
unsigned index);
9292

93-
void setBinding(PatternBindingDecl *binding, unsigned bindingIndex) {
94-
setParent(binding->getDeclContext());
95-
Binding = binding;
96-
SpareBits = bindingIndex;
97-
}
98-
93+
void setBinding(PatternBindingDecl *binding, unsigned bindingIndex);
94+
9995
PatternBindingDecl *getBinding() const { return Binding; }
10096

10197
unsigned getBindingIndex() const { return SpareBits; }

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/Decl.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1924,8 +1924,7 @@ PatternBindingDecl::create(ASTContext &Ctx, SourceLoc StaticLoc,
19241924
PBD->getTrailingObjects<PatternBindingEntry>());
19251925

19261926
for (auto idx : range(PBD->getNumPatternEntries())) {
1927-
auto *initContext =
1928-
cast_or_null<PatternBindingInitializer>(PBD->getInitContext(idx));
1927+
auto *initContext = PBD->getInitContext(idx);
19291928

19301929
// FIXME: We ought to reconsider this since it won't recontextualize any
19311930
// closures/decls present in the initialization expr. This currently should
@@ -2004,6 +2003,13 @@ ParamDecl *PatternBindingInitializer::getImplicitSelfDecl() const {
20042003
return SelfParam;
20052004
}
20062005

2006+
void PatternBindingInitializer::setBinding(PatternBindingDecl *binding,
2007+
unsigned bindingIndex) {
2008+
setParent(binding->getDeclContext());
2009+
Binding = binding;
2010+
SpareBits = bindingIndex;
2011+
}
2012+
20072013
VarDecl *PatternBindingInitializer::getInitializedLazyVar() const {
20082014
if (auto binding = getBinding()) {
20092015
if (auto var = binding->getSingleVar()) {
@@ -2232,7 +2238,7 @@ PatternBindingDecl::getCheckedPatternBindingEntry(unsigned i) const {
22322238
}
22332239

22342240
void PatternBindingDecl::setPattern(unsigned i, Pattern *P,
2235-
DeclContext *InitContext,
2241+
PatternBindingInitializer *InitContext,
22362242
bool isFullyValidated) {
22372243
auto PatternList = getMutablePatternList();
22382244
PatternList[i].setPattern(P);
@@ -2251,7 +2257,6 @@ void PatternBindingDecl::setPattern(unsigned i, Pattern *P,
22512257
}
22522258
}
22532259

2254-
22552260
VarDecl *PatternBindingDecl::getSingleVar() const {
22562261
if (getNumPatternEntries() == 1)
22572262
return getPatternList()[0].getPattern()->getSingleVar();

lib/Sema/CSApply.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9524,7 +9524,8 @@ ExprWalker::rewriteTarget(SyntacticElementTarget target) {
95249524
// Record that the pattern has been fully validated,
95259525
// this is important for subsequent call to typeCheckDecl
95269526
// because otherwise it would try to re-typecheck pattern.
9527-
patternBinding->setPattern(index, pattern, resultTarget->getDeclContext(),
9527+
patternBinding->setPattern(index, pattern,
9528+
patternBinding->getInitContext(index),
95289529
/*isFullyValidated=*/true);
95299530

95309531
if (patternBinding->isExplicitlyInitialized(index) ||

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -855,14 +855,8 @@ bool TypeChecker::typeCheckPatternBinding(PatternBindingDecl *PBD,
855855
Expr *init = PBD->getInit(patternNumber);
856856

857857
// Enter an initializer context if necessary.
858-
PatternBindingInitializer *initContext = nullptr;
859-
DeclContext *DC = PBD->getDeclContext();
860-
if (!DC->isLocalContext()) {
861-
initContext = cast_or_null<PatternBindingInitializer>(
862-
PBD->getInitContext(patternNumber));
863-
if (initContext)
864-
DC = initContext;
865-
}
858+
PatternBindingInitializer *initContext = PBD->getInitContext(patternNumber);
859+
DeclContext *DC = initContext ? initContext : PBD->getDeclContext();
866860

867861
// If we weren't given a pattern type, compute one now.
868862
if (!patternType) {

lib/Sema/TypeCheckStorage.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -608,9 +608,7 @@ static void checkAndContextualizePatternBindingInit(PatternBindingDecl *binding,
608608
return;
609609
}
610610

611-
auto *initContext =
612-
cast_or_null<PatternBindingInitializer>(binding->getInitContext(i));
613-
if (initContext) {
611+
if (auto *initContext = binding->getInitContext(i)) {
614612
auto *init = binding->getInit(i);
615613
TypeChecker::contextualizeInitializer(initContext, init);
616614
(void)binding->getInitializerIsolation(i);
@@ -2236,10 +2234,7 @@ static AccessorDecl *createGetterPrototype(AbstractStorageDecl *storage,
22362234
auto *varDecl = cast<VarDecl>(storage);
22372235
auto *bindingDecl = varDecl->getParentPatternBinding();
22382236
const auto i = bindingDecl->getPatternEntryIndexForVarDecl(varDecl);
2239-
auto *bindingInit = cast<PatternBindingInitializer>(
2240-
bindingDecl->getInitContext(i));
2241-
2242-
selfDecl = bindingInit->getImplicitSelfDecl();
2237+
selfDecl = bindingDecl->getInitContext(i)->getImplicitSelfDecl();
22432238
}
22442239
}
22452240

lib/Serialization/Deserialization.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4361,7 +4361,8 @@ class DeclDeserializer {
43614361

43624362
for (unsigned i = 0; i != patterns.size(); ++i) {
43634363
DeclContext *initContext = MF.getDeclContext(patterns[i].second);
4364-
binding->setPattern(i, patterns[i].first, initContext);
4364+
binding->setPattern(i, patterns[i].first,
4365+
cast_or_null<PatternBindingInitializer>(initContext));
43654366
}
43664367

43674368
return binding;

0 commit comments

Comments
 (0)