Skip to content

Commit f92c96a

Browse files
committed
Remove TypeChecker fields from a few walkers
Flip things so rather than storing a TypeChecker and asking for the ASTContext when needed, store an ASTContext, and ask for a TypeChecker when needed.
1 parent 643ef80 commit f92c96a

File tree

4 files changed

+85
-30
lines changed

4 files changed

+85
-30
lines changed

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,6 @@ namespace {
909909
}
910910

911911
class PreCheckExpression : public ASTWalker {
912-
TypeChecker &TC;
913912
ASTContext &Ctx;
914913
DeclContext *DC;
915914

@@ -1054,14 +1053,17 @@ namespace {
10541053
}
10551054

10561055
public:
1057-
PreCheckExpression(TypeChecker &tc, DeclContext *dc, Expr *parent)
1058-
: TC(tc), Ctx(dc->getASTContext()), DC(dc), ParentExpr(parent) {}
1056+
PreCheckExpression(DeclContext *dc, Expr *parent)
1057+
: Ctx(dc->getASTContext()), DC(dc), ParentExpr(parent) {}
10591058

10601059
ASTContext &getASTContext() const { return Ctx; }
10611060

10621061
bool walkToClosureExprPre(ClosureExpr *expr);
10631062

10641063
std::pair<bool, Expr *> walkToExprPre(Expr *expr) override {
1064+
// FIXME: Remove TypeChecker dependencies below.
1065+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
1066+
10651067
// If this is a call, record the argument expression.
10661068
if (auto call = dyn_cast<ApplyExpr>(expr)) {
10671069
if (!isa<SelfApplyExpr>(expr)) {
@@ -2012,7 +2014,7 @@ Expr *PreCheckExpression::simplifyTypeConstructionWithLiteralArg(Expr *E) {
20122014
/// Pre-check the expression, validating any types that occur in the
20132015
/// expression and folding sequence expressions.
20142016
bool TypeChecker::preCheckExpression(Expr *&expr, DeclContext *dc) {
2015-
PreCheckExpression preCheck(*this, dc, expr);
2017+
PreCheckExpression preCheck(dc, expr);
20162018
// Perform the pre-check.
20172019
if (auto result = expr->walk(preCheck)) {
20182020
expr = result;

lib/Sema/TypeCheckDecl.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2274,10 +2274,9 @@ static void checkDynamicSelfType(ValueDecl *decl, Type type) {
22742274
namespace {
22752275
class DeclChecker : public DeclVisitor<DeclChecker> {
22762276
public:
2277-
TypeChecker &TC;
22782277
ASTContext &Ctx;
22792278

2280-
explicit DeclChecker(TypeChecker &TC, ASTContext &ctx) : TC(TC), Ctx(ctx) {}
2279+
explicit DeclChecker(ASTContext &ctx) : Ctx(ctx) {}
22812280

22822281
ASTContext &getASTContext() const { return Ctx; }
22832282

@@ -2586,6 +2585,9 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
25862585

25872586
checkAccessControl(PBD);
25882587

2588+
// FIXME: Remove TypeChecker dependency.
2589+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
2590+
25892591
// If the initializers in the PBD aren't checked yet, do so now.
25902592
for (auto i : range(PBD->getNumPatternEntries())) {
25912593
if (!PBD->isInitialized(i))
@@ -2658,6 +2660,9 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
26582660
(void) SD->getImplInfo();
26592661

26602662
TypeChecker::checkParameterAttributes(SD->getIndices());
2663+
2664+
// FIXME: Remove TypeChecker dependency.
2665+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
26612666
checkDefaultArguments(TC, SD->getIndices());
26622667

26632668
if (SD->getDeclContext()->getSelfClassDecl()) {
@@ -3214,6 +3219,9 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
32143219

32153220

32163221
bool shouldSkipBodyTypechecking(const AbstractFunctionDecl *AFD) {
3222+
// FIXME: Remove TypeChecker dependency.
3223+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
3224+
32173225
// Make sure we're in the mode that's skipping function bodies.
32183226
if (!TC.canSkipNonInlinableBodies())
32193227
return false;
@@ -3257,6 +3265,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
32573265
}
32583266
}
32593267

3268+
// FIXME: Remove TypeChecker dependencies below.
3269+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
32603270
if (requiresDefinition(FD) && !FD->hasBody()) {
32613271
// Complain if we should have a body.
32623272
FD->diagnose(diag::func_decl_without_brace);
@@ -3334,6 +3344,9 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
33343344

33353345
if (auto *PL = EED->getParameterList()) {
33363346
TypeChecker::checkParameterAttributes(PL);
3347+
3348+
// FIXME: Remove TypeChecker dependency.
3349+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
33373350
checkDefaultArguments(TC, PL);
33383351
}
33393352

@@ -3584,6 +3597,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
35843597

35853598
checkAccessControl(CD);
35863599

3600+
// FIXME: Remove TypeChecker dependencies below.
3601+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
35873602
if (requiresDefinition(CD) && !CD->hasBody()) {
35883603
// Complain if we should have a body.
35893604
CD->diagnose(diag::missing_initializer_def);
@@ -3608,6 +3623,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
36083623
} else if (shouldSkipBodyTypechecking(DD)) {
36093624
DD->setBodySkipped(DD->getBodySourceRange());
36103625
} else {
3626+
// FIXME: Remove TypeChecker dependency.
3627+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
36113628
TC.definedFunctions.push_back(DD);
36123629
}
36133630
}
@@ -3659,7 +3676,7 @@ bool TypeChecker::isAvailabilitySafeForConformance(
36593676
}
36603677

36613678
void TypeChecker::typeCheckDecl(Decl *D) {
3662-
DeclChecker(*this, D->getASTContext()).visit(D);
3679+
DeclChecker(D->getASTContext()).visit(D);
36633680
}
36643681

36653682
// Returns 'nullptr' if this is the setter's 'newValue' parameter;

lib/Sema/TypeCheckREPL.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,32 +31,29 @@ using namespace swift;
3131

3232
namespace {
3333
struct REPLContext {
34-
TypeChecker &TC;
3534
ASTContext &Context;
3635
SourceFile &SF;
3736
SmallVector<ValueDecl *, 4> PrintDecls;
3837
SmallVector<ValueDecl *, 4> DebugPrintlnDecls;
3938

40-
REPLContext(TypeChecker &TC, SourceFile &SF)
41-
: TC(TC), Context(TC.Context), SF(SF) {}
39+
REPLContext(SourceFile &SF) : Context(SF.getASTContext()), SF(SF) {}
4240

4341
bool requirePrintDecls() {
4442
if (!PrintDecls.empty() && !DebugPrintlnDecls.empty())
4543
return false;
4644

45+
auto *stdlib = TypeChecker::getStdlibModule(&SF);
4746
{
4847
Identifier Id(Context.getIdentifier("_replPrintLiteralString"));
49-
auto lookup = TypeChecker::lookupUnqualified(TC.getStdlibModule(&SF), Id,
50-
SourceLoc());
48+
auto lookup = TypeChecker::lookupUnqualified(stdlib, Id, SourceLoc());
5149
if (!lookup)
5250
return true;
5351
for (auto result : lookup)
5452
PrintDecls.push_back(result.getValueDecl());
5553
}
5654
{
5755
Identifier Id(Context.getIdentifier("_replDebugPrintln"));
58-
auto lookup = TypeChecker::lookupUnqualified(TC.getStdlibModule(&SF), Id,
59-
SourceLoc());
56+
auto lookup = TypeChecker::lookupUnqualified(stdlib, Id, SourceLoc());
6057
if (!lookup)
6158
return true;
6259
for (auto result : lookup)
@@ -191,8 +188,8 @@ namespace {
191188
unsigned NextResponseVariableIndex = 0;
192189

193190
public:
194-
REPLChecker(TypeChecker &TC, SourceFile &SF, TopLevelContext &TLC)
195-
: REPLContext(TC, SF), TLC(TLC) {}
191+
REPLChecker(SourceFile &SF, TopLevelContext &TLC)
192+
: REPLContext(SF), TLC(TLC) {}
196193

197194
void processREPLTopLevelExpr(Expr *E);
198195
void processREPLTopLevelPatternBinding(PatternBindingDecl *PBD);
@@ -257,6 +254,9 @@ void REPLChecker::generatePrintOfExpression(StringRef NameStr, Expr *E) {
257254
// Typecheck the function.
258255
BraceStmt *Body = builder.createBodyStmt(Loc, EndLoc);
259256
CE->setBody(Body, false);
257+
258+
// FIXME: Remove TypeChecker dependency.
259+
auto &TC = *Context.getLegacyGlobalTypeChecker();
260260
TC.typeCheckClosureBody(CE);
261261
TC.ClosuresWithUncomputedCaptures.push_back(CE);
262262

@@ -437,7 +437,7 @@ void TypeChecker::processREPLTopLevel(SourceFile &SF, TopLevelContext &TLC,
437437
std::vector<Decl *> NewDecls(SF.Decls.begin()+FirstDecl, SF.Decls.end());
438438
SF.Decls.resize(FirstDecl);
439439

440-
REPLChecker RC(*this, SF, TLC);
440+
REPLChecker RC(SF, TLC);
441441

442442
// Loop over each of the new decls, processing them, adding them back to
443443
// the Decls list.

lib/Sema/TypeCheckStmt.cpp

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,6 @@ static void tryDiagnoseUnnecessaryCastOverOptionSet(ASTContext &Ctx,
297297
namespace {
298298
class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
299299
public:
300-
TypeChecker &TC;
301300
ASTContext &Ctx;
302301

303302
/// This is the current function or closure being checked.
@@ -374,16 +373,16 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
374373
}
375374
};
376375

377-
StmtChecker(TypeChecker &TC, AbstractFunctionDecl *AFD)
378-
: TC(TC), Ctx(AFD->getASTContext()), TheFunc(AFD), DC(AFD), IsREPL(false),
376+
StmtChecker(AbstractFunctionDecl *AFD)
377+
: Ctx(AFD->getASTContext()), TheFunc(AFD), DC(AFD), IsREPL(false),
379378
IsBraceStmtFromTopLevelDecl(false) {}
380379

381-
StmtChecker(TypeChecker &TC, ClosureExpr *TheClosure)
382-
: TC(TC), Ctx(TheClosure->getASTContext()), TheFunc(TheClosure),
380+
StmtChecker(ClosureExpr *TheClosure)
381+
: Ctx(TheClosure->getASTContext()), TheFunc(TheClosure),
383382
DC(TheClosure), IsREPL(false), IsBraceStmtFromTopLevelDecl(false) {}
384383

385-
StmtChecker(TypeChecker &TC, DeclContext *DC)
386-
: TC(TC), Ctx(DC->getASTContext()), TheFunc(), DC(DC), IsREPL(false),
384+
StmtChecker(DeclContext *DC)
385+
: Ctx(DC->getASTContext()), TheFunc(), DC(DC), IsREPL(false),
387386
IsBraceStmtFromTopLevelDecl(false) {
388387
if (const SourceFile *SF = DC->getParentSourceFile())
389388
if (SF->Kind == SourceFileKind::REPL)
@@ -545,6 +544,8 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
545544
}
546545
}
547546

547+
// FIXME: Remove TypeChecker dependency.
548+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
548549
auto exprTy = TC.typeCheckExpression(E, DC, TypeLoc::withoutLoc(ResultTy),
549550
ctp,
550551
options);
@@ -606,6 +607,8 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
606607
contextTypePurpose = CTP_YieldByValue;
607608
}
608609

610+
// FIXME: Remove TypeChecker dependency.
611+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
609612
TC.typeCheckExpression(exprToCheck, DC,
610613
TypeLoc::withoutLoc(contextType),
611614
contextTypePurpose);
@@ -637,20 +640,28 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
637640
Type exnType = getASTContext().getErrorDecl()->getDeclaredType();
638641
if (!exnType) return TS;
639642

643+
// FIXME: Remove TypeChecker dependency.
644+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
640645
TC.typeCheckExpression(E, DC, TypeLoc::withoutLoc(exnType), CTP_ThrowStmt);
641646
TS->setSubExpr(E);
642647

643648
return TS;
644649
}
645650

646651
Stmt *visitPoundAssertStmt(PoundAssertStmt *PA) {
652+
// FIXME: Remove TypeChecker dependency.
653+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
654+
647655
Expr *C = PA->getCondition();
648656
TC.typeCheckCondition(C, DC);
649657
PA->setCondition(C);
650658
return PA;
651659
}
652660

653661
Stmt *visitDeferStmt(DeferStmt *DS) {
662+
// FIXME: Remove TypeChecker dependency.
663+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
664+
654665
TC.typeCheckDecl(DS->getTempDecl());
655666

656667
Expr *theCall = DS->getCallExpr();
@@ -661,6 +672,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
661672
}
662673

663674
Stmt *visitIfStmt(IfStmt *IS) {
675+
// FIXME: Remove TypeChecker dependency.
676+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
677+
664678
StmtCondition C = IS->getCond();
665679
TC.typeCheckStmtCondition(C, DC, diag::if_always_true);
666680
IS->setCond(C);
@@ -680,6 +694,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
680694
}
681695

682696
Stmt *visitGuardStmt(GuardStmt *GS) {
697+
// FIXME: Remove TypeChecker dependency.
698+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
699+
683700
StmtCondition C = GS->getCond();
684701
TC.typeCheckStmtCondition(C, DC, diag::guard_always_succeeds);
685702
GS->setCond(C);
@@ -701,6 +718,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
701718
}
702719

703720
Stmt *visitWhileStmt(WhileStmt *WS) {
721+
// FIXME: Remove TypeChecker dependency.
722+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
723+
704724
StmtCondition C = WS->getCond();
705725
TC.typeCheckStmtCondition(C, DC, diag::while_always_true);
706726
WS->setCond(C);
@@ -719,7 +739,10 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
719739
typeCheckStmt(S);
720740
RWS->setBody(S);
721741
}
722-
742+
743+
// FIXME: Remove TypeChecker dependency.
744+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
745+
723746
Expr *E = RWS->getCond();
724747
TC.typeCheckCondition(E, DC);
725748
RWS->setCond(E);
@@ -738,7 +761,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
738761
S->getPattern()->setType(ErrorType::get(getASTContext()));
739762
return nullptr;
740763
}
741-
764+
765+
// FIXME: Remove TypeChecker dependency.
766+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
742767
if (TC.typeCheckPattern(S->getPattern(), DC, options)) {
743768
// FIXME: Handle errors better.
744769
S->getPattern()->setType(ErrorType::get(getASTContext()));
@@ -1081,6 +1106,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
10811106
return;
10821107
}
10831108

1109+
// FIXME: Remove TypeChecker dependency.
1110+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
1111+
10841112
pattern = newPattern;
10851113
// Coerce the pattern to the subject's type.
10861114
TypeResolutionOptions patternOptions(TypeResolverContext::InExpression);
@@ -1281,6 +1309,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
12811309
}
12821310

12831311
Stmt *visitSwitchStmt(SwitchStmt *switchStmt) {
1312+
// FIXME: Remove TypeChecker dependency.
1313+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
1314+
12841315
// Type-check the subject expression.
12851316
Expr *subjectExpr = switchStmt->getSubjectExpr();
12861317
auto resultTy = TC.typeCheckExpression(subjectExpr, DC);
@@ -1436,6 +1467,9 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
14361467
}
14371468

14381469
void checkCatchStmt(CatchStmt *S) {
1470+
// FIXME: Remove TypeChecker dependency.
1471+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
1472+
14391473
// Check the catch pattern.
14401474
TC.typeCheckCatchPattern(S, DC);
14411475

@@ -1804,6 +1838,8 @@ Stmt *StmtChecker::visitBraceStmt(BraceStmt *BS) {
18041838
}
18051839
}
18061840

1841+
// FIXME: Remove TypeChecker dependencies below.
1842+
auto &TC = *Ctx.getLegacyGlobalTypeChecker();
18071843
for (auto &elem : BS->getElements()) {
18081844
if (auto *SubExpr = elem.dyn_cast<Expr*>()) {
18091845
SourceLoc Loc = SubExpr->getStartLoc();
@@ -2150,7 +2186,7 @@ TypeCheckFunctionBodyUntilRequest::evaluate(Evaluator &evaluator,
21502186
if (ctx.LangOpts.EnableASTScopeLookup)
21512187
ASTScope::expandFunctionBody(AFD);
21522188

2153-
StmtChecker SC(tc, AFD);
2189+
StmtChecker SC(AFD);
21542190
SC.EndTypeCheckLoc = endTypeCheckLoc;
21552191
bool hadError = SC.typeCheckBody(body);
21562192

@@ -2203,7 +2239,7 @@ bool TypeChecker::typeCheckClosureBody(ClosureExpr *closure) {
22032239
if (DebugTimeFunctionBodies || WarnLongFunctionBodies)
22042240
timer.emplace(closure, DebugTimeFunctionBodies, WarnLongFunctionBodies);
22052241

2206-
bool HadError = StmtChecker(*this, closure).typeCheckBody(body);
2242+
bool HadError = StmtChecker(closure).typeCheckBody(body);
22072243
if (body) {
22082244
closure->setBody(body, closure->hasSingleExpressionBody());
22092245
}
@@ -2214,7 +2250,7 @@ bool TypeChecker::typeCheckTapBody(TapExpr *expr, DeclContext *DC) {
22142250
// We intentionally use typeCheckStmt instead of typeCheckBody here
22152251
// because we want to contextualize TapExprs with the body they're in.
22162252
BraceStmt *body = expr->getBody();
2217-
bool HadError = StmtChecker(*this, DC).typeCheckStmt(body);
2253+
bool HadError = StmtChecker(DC).typeCheckStmt(body);
22182254
if (body) {
22192255
expr->setBody(body);
22202256
}
@@ -2226,7 +2262,7 @@ void TypeChecker::typeCheckTopLevelCodeDecl(TopLevelCodeDecl *TLCD) {
22262262
// because we want to contextualize all the TopLevelCode
22272263
// declarations simultaneously.
22282264
BraceStmt *Body = TLCD->getBody();
2229-
StmtChecker(*this, TLCD).typeCheckStmt(Body);
2265+
StmtChecker(TLCD).typeCheckStmt(Body);
22302266
TLCD->setBody(Body);
22312267
checkTopLevelErrorHandling(TLCD);
22322268
performTopLevelDeclDiagnostics(TLCD);

0 commit comments

Comments
 (0)