Skip to content

Commit 47f7a31

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 3399b79 commit 47f7a31

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"
@@ -1962,7 +1963,7 @@ class PatternBindingEntry {
19621963
IsFromDebugger = 1 << 2,
19631964
};
19641965
/// The initializer context used for this pattern binding entry.
1965-
llvm::PointerIntPair<DeclContext *, 3, OptionSet<PatternFlags>>
1966+
llvm::PointerIntPair<PatternBindingInitializer *, 3, OptionSet<PatternFlags>>
19661967
InitContextAndFlags;
19671968

19681969
/// Values captured by this initializer.
@@ -2003,7 +2004,7 @@ class PatternBindingEntry {
20032004
public:
20042005
/// \p E is the initializer as parsed.
20052006
PatternBindingEntry(Pattern *P, SourceLoc EqualLoc, Expr *E,
2006-
DeclContext *InitContext)
2007+
PatternBindingInitializer *InitContext)
20072008
: PatternAndFlags(P, {}),
20082009
InitExpr({E, {E, InitializerStatus::NotChecked}, EqualLoc}),
20092010
InitContextAndFlags({InitContext, llvm::None}) {}
@@ -2107,12 +2108,14 @@ class PatternBindingEntry {
21072108
VarDecl *getAnchoringVarDecl() const;
21082109

21092110
// Retrieve the declaration context for the initializer.
2110-
DeclContext *getInitContext() const {
2111+
PatternBindingInitializer *getInitContext() const {
21112112
return InitContextAndFlags.getPointer();
21122113
}
21132114

21142115
/// Override the initializer context.
2115-
void setInitContext(DeclContext *dc) { InitContextAndFlags.setPointer(dc); }
2116+
void setInitContext(PatternBindingInitializer *init) {
2117+
InitContextAndFlags.setPointer(init);
2118+
}
21162119

21172120
SourceLoc getStartLoc() const;
21182121

@@ -2310,15 +2313,16 @@ class PatternBindingDecl final : public Decl,
23102313
Pattern *getPattern(unsigned i) const {
23112314
return getPatternList()[i].getPattern();
23122315
}
2313-
2314-
void setPattern(unsigned i, Pattern *Pat, DeclContext *InitContext,
2316+
2317+
void setPattern(unsigned i, Pattern *Pat,
2318+
PatternBindingInitializer *InitContext,
23152319
bool isFullyValidated = false);
23162320

23172321
bool isFullyValidated(unsigned i) const {
23182322
return getPatternList()[i].isFullyValidated();
23192323
}
23202324

2321-
DeclContext *getInitContext(unsigned i) const {
2325+
PatternBindingInitializer *getInitContext(unsigned i) const {
23222326
return getPatternList()[i].getInitContext();
23232327
}
23242328

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
@@ -9476,7 +9476,8 @@ ExprWalker::rewriteTarget(SyntacticElementTarget target) {
94769476
// Record that the pattern has been fully validated,
94779477
// this is important for subsequent call to typeCheckDecl
94789478
// because otherwise it would try to re-typecheck pattern.
9479-
patternBinding->setPattern(index, pattern, resultTarget->getDeclContext(),
9479+
patternBinding->setPattern(index, pattern,
9480+
patternBinding->getInitContext(index),
94809481
/*isFullyValidated=*/true);
94819482

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

lib/Sema/TypeCheckConstraints.cpp

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

873873
// Enter an initializer context if necessary.
874-
PatternBindingInitializer *initContext = nullptr;
875-
DeclContext *DC = PBD->getDeclContext();
876-
if (!DC->isLocalContext()) {
877-
initContext = cast_or_null<PatternBindingInitializer>(
878-
PBD->getInitContext(patternNumber));
879-
if (initContext)
880-
DC = initContext;
881-
}
874+
PatternBindingInitializer *initContext = PBD->getInitContext(patternNumber);
875+
DeclContext *DC = initContext ? initContext : PBD->getDeclContext();
882876

883877
// If we weren't given a pattern type, compute one now.
884878
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);
@@ -2235,10 +2233,7 @@ static AccessorDecl *createGetterPrototype(AbstractStorageDecl *storage,
22352233
auto *varDecl = cast<VarDecl>(storage);
22362234
auto *bindingDecl = varDecl->getParentPatternBinding();
22372235
const auto i = bindingDecl->getPatternEntryIndexForVarDecl(varDecl);
2238-
auto *bindingInit = cast<PatternBindingInitializer>(
2239-
bindingDecl->getInitContext(i));
2240-
2241-
selfDecl = bindingInit->getImplicitSelfDecl();
2236+
selfDecl = bindingDecl->getInitContext(i)->getImplicitSelfDecl();
22422237
}
22432238
}
22442239

lib/Serialization/Deserialization.cpp

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

43644364
for (unsigned i = 0; i != patterns.size(); ++i) {
43654365
DeclContext *initContext = MF.getDeclContext(patterns[i].second);
4366-
binding->setPattern(i, patterns[i].first, initContext);
4366+
binding->setPattern(i, patterns[i].first,
4367+
cast_or_null<PatternBindingInitializer>(initContext));
43674368
}
43684369

43694370
return binding;

0 commit comments

Comments
 (0)