Skip to content

Commit 5e4f5a4

Browse files
committed
Sema: Remove DeclChecker::IsFirstPass
1 parent 435d66f commit 5e4f5a4

File tree

6 files changed

+17
-114
lines changed

6 files changed

+17
-114
lines changed

lib/Sema/CodeSynthesis.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1413,8 +1413,7 @@ void TypeChecker::completePropertyBehaviorParameter(VarDecl *VD,
14131413
SourceLoc(), /*implicit*/ true);
14141414
Parameter->setBody(Body);
14151415

1416-
typeCheckDecl(Parameter, true);
1417-
typeCheckDecl(Parameter, false);
1416+
typeCheckDecl(Parameter);
14181417
addMemberToContextIfNeeded(Parameter, DC);
14191418

14201419
// Add the witnesses to the conformance.

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -819,10 +819,8 @@ namespace {
819819
if (auto captureList = dyn_cast<CaptureListExpr>(expr)) {
820820
// Validate the capture list.
821821
for (auto capture : captureList->getCaptureList()) {
822-
TC.typeCheckDecl(capture.Init, true);
823-
TC.typeCheckDecl(capture.Init, false);
824-
TC.typeCheckDecl(capture.Var, true);
825-
TC.typeCheckDecl(capture.Var, false);
822+
TC.typeCheckDecl(capture.Init);
823+
TC.typeCheckDecl(capture.Var);
826824
}
827825

828826
// Since closure expression is contained by capture list

lib/Sema/TypeCheckDecl.cpp

Lines changed: 7 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -3959,23 +3959,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
39593959
public:
39603960
TypeChecker &TC;
39613961

3962-
// For library-style parsing, we need to make two passes over the global
3963-
// scope. These booleans indicate whether this is currently the first or
3964-
// second pass over the global scope (or neither, if we're in a context where
3965-
// we only visit each decl once).
3966-
unsigned IsFirstPass : 1;
3967-
3968-
DeclChecker(TypeChecker &TC, bool IsFirstPass)
3969-
: TC(TC), IsFirstPass(IsFirstPass) {}
3962+
explicit DeclChecker(TypeChecker &TC) : TC(TC) {}
39703963

39713964
void visit(Decl *decl) {
39723965
FrontendStatsTracer StatsTracer(TC.Context.Stats, "typecheck-decl", decl);
39733966
PrettyStackTraceDecl StackTrace("type-checking", decl);
39743967

39753968
DeclVisitor<DeclChecker>::visit(decl);
39763969

3977-
if (IsFirstPass)
3978-
TC.checkUnsupportedProtocolType(decl);
3970+
TC.checkUnsupportedProtocolType(decl);
39793971

39803972
if (auto VD = dyn_cast<ValueDecl>(decl)) {
39813973
checkRedeclaration(TC, VD);
@@ -3985,8 +3977,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
39853977
// expressions to mean something builtin to the language. We *do* allow
39863978
// these if they are escaped with backticks though.
39873979
auto &Context = TC.Context;
3988-
if (IsFirstPass &&
3989-
VD->getDeclContext()->isTypeContext() &&
3980+
if (VD->getDeclContext()->isTypeContext() &&
39903981
(VD->getFullName().isSimpleName(Context.Id_Type) ||
39913982
VD->getFullName().isSimpleName(Context.Id_Protocol)) &&
39923983
VD->getNameLoc().isValid() &&
@@ -4115,14 +4106,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
41154106
// (that were previously only validated at point of synthesis)
41164107
if (auto getter = VD->getGetter()) {
41174108
if (getter->hasBody()) {
4118-
TC.typeCheckDecl(getter, true);
4119-
TC.typeCheckDecl(getter, false);
4109+
TC.typeCheckDecl(getter);
41204110
}
41214111
}
41224112
if (auto setter = VD->getSetter()) {
41234113
if (setter->hasBody()) {
4124-
TC.typeCheckDecl(setter, true);
4125-
TC.typeCheckDecl(setter, false);
4114+
TC.typeCheckDecl(setter);
41264115
}
41274116
}
41284117

@@ -4135,9 +4124,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
41354124
}
41364125

41374126
void visitPatternBindingDecl(PatternBindingDecl *PBD) {
4138-
if (!IsFirstPass)
4139-
return;
4140-
41414127
if (PBD->isBeingValidated())
41424128
return;
41434129

@@ -4264,20 +4250,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
42644250
}
42654251

42664252
void visitSubscriptDecl(SubscriptDecl *SD) {
4267-
if (!IsFirstPass) {
4268-
return;
4269-
}
4270-
42714253
TC.validateDecl(SD);
42724254
TC.checkDeclAttributes(SD);
42734255
checkAccessControl(TC, SD);
42744256
}
42754257

42764258
void visitTypeAliasDecl(TypeAliasDecl *TAD) {
4277-
if (!IsFirstPass) {
4278-
return;
4279-
}
4280-
42814259
TC.checkDeclAttributesEarly(TAD);
42824260
TC.computeAccessLevel(TAD);
42834261

@@ -4287,10 +4265,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
42874265
}
42884266

42894267
void visitAssociatedTypeDecl(AssociatedTypeDecl *AT) {
4290-
if (!IsFirstPass) {
4291-
return;
4292-
}
4293-
42944268
TC.validateDecl(AT);
42954269

42964270
auto *proto = AT->getProtocol();
@@ -4350,13 +4324,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
43504324
}
43514325

43524326
void visitEnumDecl(EnumDecl *ED) {
4353-
if (!IsFirstPass) {
4354-
for (Decl *member : ED->getMembers())
4355-
visit(member);
4356-
4357-
return;
4358-
}
4359-
43604327
TC.checkDeclAttributesEarly(ED);
43614328
TC.computeAccessLevel(ED);
43624329

@@ -4390,13 +4357,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
43904357
}
43914358

43924359
void visitStructDecl(StructDecl *SD) {
4393-
if (!IsFirstPass) {
4394-
for (Decl *Member : SD->getMembers())
4395-
visit(Member);
4396-
4397-
return;
4398-
}
4399-
44004360
TC.checkDeclAttributesEarly(SD);
44014361
TC.computeAccessLevel(SD);
44024362

@@ -4521,13 +4481,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
45214481

45224482

45234483
void visitClassDecl(ClassDecl *CD) {
4524-
if (!IsFirstPass) {
4525-
for (Decl *Member : CD->getMembers())
4526-
visit(Member);
4527-
4528-
return;
4529-
}
4530-
45314484
TC.checkDeclAttributesEarly(CD);
45324485
TC.computeAccessLevel(CD);
45334486

@@ -4652,13 +4605,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
46524605
}
46534606

46544607
void visitProtocolDecl(ProtocolDecl *PD) {
4655-
if (!IsFirstPass) {
4656-
for (auto Member : PD->getMembers())
4657-
visit(Member);
4658-
4659-
return;
4660-
}
4661-
46624608
TC.checkDeclAttributesEarly(PD);
46634609
TC.computeAccessLevel(PD);
46644610

@@ -4771,9 +4717,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47714717
}
47724718

47734719
void visitFuncDecl(FuncDecl *FD) {
4774-
if (!IsFirstPass)
4775-
return;
4776-
47774720
TC.validateDecl(FD);
47784721
checkAccessControl(TC, FD);
47794722

@@ -6185,22 +6128,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
61856128
}
61866129

61876130
void visitEnumElementDecl(EnumElementDecl *EED) {
6188-
if (!IsFirstPass) {
6189-
return;
6190-
}
6191-
61926131
TC.validateDecl(EED);
61936132
TC.checkDeclAttributes(EED);
61946133
checkAccessControl(TC, EED);
61956134
}
61966135

61976136
void visitExtensionDecl(ExtensionDecl *ED) {
6198-
if (!IsFirstPass) {
6199-
for (Decl *Member : ED->getMembers())
6200-
visit(Member);
6201-
return;
6202-
}
6203-
62046137
TC.validateExtension(ED);
62056138

62066139
TC.checkDeclAttributesEarly(ED);
@@ -6295,10 +6228,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
62956228
}
62966229

62976230
void visitConstructorDecl(ConstructorDecl *CD) {
6298-
if (!IsFirstPass) {
6299-
return;
6300-
}
6301-
63026231
TC.validateDecl(CD);
63036232

63046233
// If this initializer overrides a 'required' initializer, it must itself
@@ -6353,10 +6282,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
63536282
}
63546283

63556284
void visitDestructorDecl(DestructorDecl *DD) {
6356-
if (!IsFirstPass) {
6357-
return;
6358-
}
6359-
63606285
TC.validateDecl(DD);
63616286
TC.checkDeclAttributes(DD);
63626287

@@ -6426,9 +6351,9 @@ bool TypeChecker::isAvailabilitySafeForConformance(
64266351
return requirementInfo.isContainedIn(witnessInfo);
64276352
}
64286353

6429-
void TypeChecker::typeCheckDecl(Decl *D, bool isFirstPass) {
6354+
void TypeChecker::typeCheckDecl(Decl *D) {
64306355
checkForForbiddenPrefix(D);
6431-
DeclChecker(*this, isFirstPass).visit(D);
6356+
DeclChecker(*this).visit(D);
64326357
}
64336358

64346359
// A class is @objc if it does not have generic ancestry, and it either has

lib/Sema/TypeCheckStmt.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,7 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
480480
}
481481

482482
Stmt *visitDeferStmt(DeferStmt *DS) {
483-
TC.typeCheckDecl(DS->getTempDecl(), /*isFirstPass*/true);
484-
TC.typeCheckDecl(DS->getTempDecl(), /*isFirstPass*/false);
483+
TC.typeCheckDecl(DS->getTempDecl());
485484

486485
Expr *theCall = DS->getCallExpr();
487486
TC.typeCheckExpression(theCall, DC);
@@ -836,8 +835,7 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
836835
// the list of raw cases.
837836
for (auto node : S->getRawCases()) {
838837
if (!node.is<Decl*>()) continue;
839-
TC.typeCheckDecl(node.get<Decl*>(), /*isFirstPass*/true);
840-
TC.typeCheckDecl(node.get<Decl*>(), /*isFirstPass*/false);
838+
TC.typeCheckDecl(node.get<Decl*>());
841839
}
842840

843841
auto cases = S->getCases();
@@ -1356,8 +1354,7 @@ Stmt *StmtChecker::visitBraceStmt(BraceStmt *BS) {
13561354
(Loc == EndTypeCheckLoc || SM.isBeforeInBuffer(EndTypeCheckLoc, Loc)))
13571355
break;
13581356

1359-
TC.typeCheckDecl(SubDecl, /*isFirstPass*/true);
1360-
TC.typeCheckDecl(SubDecl, /*isFirstPass*/false);
1357+
TC.typeCheckDecl(SubDecl);
13611358
}
13621359

13631360
return BS;

lib/Sema/TypeChecker.cpp

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -511,8 +511,7 @@ static void typeCheckFunctionsAndExternalDecls(SourceFile &SF, TypeChecker &TC)
511511
currentSynthesizedDecl != n;
512512
++currentSynthesizedDecl) {
513513
auto decl = SF.SynthesizedDecls[currentSynthesizedDecl];
514-
TC.typeCheckDecl(decl, /*isFirstPass*/true);
515-
TC.typeCheckDecl(decl, /*isFirstPass*/false);
514+
TC.typeCheckDecl(decl);
516515
}
517516

518517
// Ensure that the requirements of the given conformance are
@@ -663,30 +662,15 @@ void swift::performTypeChecking(SourceFile &SF, TopLevelContext &TLC,
663662
}
664663
});
665664

666-
// FIXME: Check for cycles in class inheritance here?
667-
668665
// Type check the top-level elements of the source file.
669-
for (auto D : llvm::makeArrayRef(SF.Decls).slice(StartElem)) {
670-
if (isa<TopLevelCodeDecl>(D))
671-
continue;
672-
673-
TC.typeCheckDecl(D, /*isFirstPass*/true);
674-
}
675-
676-
// At this point, we can perform general name lookup into any type.
677-
678-
// We don't know the types of all the global declarations in the first
679-
// pass, which means we can't completely analyze everything. Perform the
680-
// second pass now.
681-
682666
bool hasTopLevelCode = false;
683667
for (auto D : llvm::makeArrayRef(SF.Decls).slice(StartElem)) {
684668
if (auto *TLCD = dyn_cast<TopLevelCodeDecl>(D)) {
685669
hasTopLevelCode = true;
686670
// Immediately perform global name-binding etc.
687671
TC.typeCheckTopLevelCodeDecl(TLCD);
688672
} else {
689-
TC.typeCheckDecl(D, /*isFirstPass*/false);
673+
TC.typeCheckDecl(D);
690674
}
691675
}
692676

@@ -820,7 +804,7 @@ bool swift::typeCheckCompletionDecl(Decl *D) {
820804
if (auto ext = dyn_cast<ExtensionDecl>(D))
821805
TC.validateExtension(ext);
822806
else
823-
TC.typeCheckDecl(D, true);
807+
TC.typeCheckDecl(D);
824808
return true;
825809
}
826810

lib/Sema/TypeChecker.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1305,7 +1305,7 @@ class TypeChecker final : public LazyResolver {
13051305
unsigned StartElem);
13061306
Identifier getNextResponseVariableName(DeclContext *DC);
13071307

1308-
void typeCheckDecl(Decl *D, bool isFirstPass);
1308+
void typeCheckDecl(Decl *D);
13091309

13101310
void checkDeclAttributesEarly(Decl *D);
13111311
void checkDeclAttributes(Decl *D);

0 commit comments

Comments
 (0)