@@ -3959,23 +3959,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
3959
3959
public:
3960
3960
TypeChecker &TC;
3961
3961
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) {}
3970
3963
3971
3964
void visit (Decl *decl) {
3972
3965
FrontendStatsTracer StatsTracer (TC.Context .Stats , " typecheck-decl" , decl);
3973
3966
PrettyStackTraceDecl StackTrace (" type-checking" , decl);
3974
3967
3975
3968
DeclVisitor<DeclChecker>::visit (decl);
3976
3969
3977
- if (IsFirstPass)
3978
- TC.checkUnsupportedProtocolType (decl);
3970
+ TC.checkUnsupportedProtocolType (decl);
3979
3971
3980
3972
if (auto VD = dyn_cast<ValueDecl>(decl)) {
3981
3973
checkRedeclaration (TC, VD);
@@ -3985,8 +3977,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
3985
3977
// expressions to mean something builtin to the language. We *do* allow
3986
3978
// these if they are escaped with backticks though.
3987
3979
auto &Context = TC.Context ;
3988
- if (IsFirstPass &&
3989
- VD->getDeclContext ()->isTypeContext () &&
3980
+ if (VD->getDeclContext ()->isTypeContext () &&
3990
3981
(VD->getFullName ().isSimpleName (Context.Id_Type ) ||
3991
3982
VD->getFullName ().isSimpleName (Context.Id_Protocol )) &&
3992
3983
VD->getNameLoc ().isValid () &&
@@ -4115,14 +4106,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4115
4106
// (that were previously only validated at point of synthesis)
4116
4107
if (auto getter = VD->getGetter ()) {
4117
4108
if (getter->hasBody ()) {
4118
- TC.typeCheckDecl (getter, true );
4119
- TC.typeCheckDecl (getter, false );
4109
+ TC.typeCheckDecl (getter);
4120
4110
}
4121
4111
}
4122
4112
if (auto setter = VD->getSetter ()) {
4123
4113
if (setter->hasBody ()) {
4124
- TC.typeCheckDecl (setter, true );
4125
- TC.typeCheckDecl (setter, false );
4114
+ TC.typeCheckDecl (setter);
4126
4115
}
4127
4116
}
4128
4117
@@ -4135,9 +4124,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4135
4124
}
4136
4125
4137
4126
void visitPatternBindingDecl (PatternBindingDecl *PBD) {
4138
- if (!IsFirstPass)
4139
- return ;
4140
-
4141
4127
if (PBD->isBeingValidated ())
4142
4128
return ;
4143
4129
@@ -4264,20 +4250,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4264
4250
}
4265
4251
4266
4252
void visitSubscriptDecl (SubscriptDecl *SD) {
4267
- if (!IsFirstPass) {
4268
- return ;
4269
- }
4270
-
4271
4253
TC.validateDecl (SD);
4272
4254
TC.checkDeclAttributes (SD);
4273
4255
checkAccessControl (TC, SD);
4274
4256
}
4275
4257
4276
4258
void visitTypeAliasDecl (TypeAliasDecl *TAD) {
4277
- if (!IsFirstPass) {
4278
- return ;
4279
- }
4280
-
4281
4259
TC.checkDeclAttributesEarly (TAD);
4282
4260
TC.computeAccessLevel (TAD);
4283
4261
@@ -4287,10 +4265,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4287
4265
}
4288
4266
4289
4267
void visitAssociatedTypeDecl (AssociatedTypeDecl *AT) {
4290
- if (!IsFirstPass) {
4291
- return ;
4292
- }
4293
-
4294
4268
TC.validateDecl (AT);
4295
4269
4296
4270
auto *proto = AT->getProtocol ();
@@ -4350,14 +4324,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4350
4324
}
4351
4325
4352
4326
void visitEnumDecl (EnumDecl *ED) {
4353
- if (!IsFirstPass) {
4354
- for (Decl *member : ED->getMembers ())
4355
- visit (member);
4356
-
4357
- TC.checkConformancesInContext (ED, ED);
4358
- return ;
4359
- }
4360
-
4361
4327
TC.checkDeclAttributesEarly (ED);
4362
4328
TC.computeAccessLevel (ED);
4363
4329
@@ -4387,17 +4353,10 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4387
4353
}
4388
4354
4389
4355
TC.checkDeclCircularity (ED);
4356
+ TC.ConformanceContexts .push_back (ED);
4390
4357
}
4391
4358
4392
4359
void visitStructDecl (StructDecl *SD) {
4393
- if (!IsFirstPass) {
4394
- for (Decl *Member : SD->getMembers ())
4395
- visit (Member);
4396
-
4397
- TC.checkConformancesInContext (SD, SD);
4398
- return ;
4399
- }
4400
-
4401
4360
TC.checkDeclAttributesEarly (SD);
4402
4361
TC.computeAccessLevel (SD);
4403
4362
@@ -4415,6 +4374,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4415
4374
checkAccessControl (TC, SD);
4416
4375
4417
4376
TC.checkDeclCircularity (SD);
4377
+ TC.ConformanceContexts .push_back (SD);
4418
4378
}
4419
4379
4420
4380
// / Check whether the given properties can be @NSManaged in this class.
@@ -4521,14 +4481,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4521
4481
4522
4482
4523
4483
void visitClassDecl (ClassDecl *CD) {
4524
- if (!IsFirstPass) {
4525
- for (Decl *Member : CD->getMembers ())
4526
- visit (Member);
4527
-
4528
- TC.checkConformancesInContext (CD, CD);
4529
- return ;
4530
- }
4531
-
4532
4484
TC.checkDeclAttributesEarly (CD);
4533
4485
TC.computeAccessLevel (CD);
4534
4486
@@ -4649,16 +4601,10 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4649
4601
checkAccessControl (TC, CD);
4650
4602
4651
4603
TC.checkDeclCircularity (CD);
4604
+ TC.ConformanceContexts .push_back (CD);
4652
4605
}
4653
4606
4654
4607
void visitProtocolDecl (ProtocolDecl *PD) {
4655
- if (!IsFirstPass) {
4656
- for (auto Member : PD->getMembers ())
4657
- visit (Member);
4658
-
4659
- return ;
4660
- }
4661
-
4662
4608
TC.checkDeclAttributesEarly (PD);
4663
4609
TC.computeAccessLevel (PD);
4664
4610
@@ -4771,9 +4717,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4771
4717
}
4772
4718
4773
4719
void visitFuncDecl (FuncDecl *FD) {
4774
- if (!IsFirstPass)
4775
- return ;
4776
-
4777
4720
TC.validateDecl (FD);
4778
4721
checkAccessControl (TC, FD);
4779
4722
@@ -6185,22 +6128,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
6185
6128
}
6186
6129
6187
6130
void visitEnumElementDecl (EnumElementDecl *EED) {
6188
- if (!IsFirstPass) {
6189
- return ;
6190
- }
6191
-
6192
6131
TC.validateDecl (EED);
6193
6132
TC.checkDeclAttributes (EED);
6194
6133
checkAccessControl (TC, EED);
6195
6134
}
6196
6135
6197
6136
void visitExtensionDecl (ExtensionDecl *ED) {
6198
- if (!IsFirstPass) {
6199
- for (Decl *Member : ED->getMembers ())
6200
- visit (Member);
6201
- return ;
6202
- }
6203
-
6204
6137
TC.validateExtension (ED);
6205
6138
6206
6139
TC.checkDeclAttributesEarly (ED);
@@ -6241,7 +6174,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
6241
6174
for (Decl *Member : ED->getMembers ())
6242
6175
visit (Member);
6243
6176
6244
- TC.checkConformancesInContext (ED, ED);
6177
+ TC.ConformanceContexts . push_back ( ED);
6245
6178
6246
6179
if (!ED->isInvalid ())
6247
6180
TC.checkDeclAttributes (ED);
@@ -6295,10 +6228,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
6295
6228
}
6296
6229
6297
6230
void visitConstructorDecl (ConstructorDecl *CD) {
6298
- if (!IsFirstPass) {
6299
- return ;
6300
- }
6301
-
6302
6231
TC.validateDecl (CD);
6303
6232
6304
6233
// If this initializer overrides a 'required' initializer, it must itself
@@ -6353,10 +6282,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
6353
6282
}
6354
6283
6355
6284
void visitDestructorDecl (DestructorDecl *DD) {
6356
- if (!IsFirstPass) {
6357
- return ;
6358
- }
6359
-
6360
6285
TC.validateDecl (DD);
6361
6286
TC.checkDeclAttributes (DD);
6362
6287
@@ -6426,9 +6351,9 @@ bool TypeChecker::isAvailabilitySafeForConformance(
6426
6351
return requirementInfo.isContainedIn (witnessInfo);
6427
6352
}
6428
6353
6429
- void TypeChecker::typeCheckDecl (Decl *D, bool isFirstPass ) {
6354
+ void TypeChecker::typeCheckDecl (Decl *D) {
6430
6355
checkForForbiddenPrefix (D);
6431
- DeclChecker (*this , isFirstPass ).visit (D);
6356
+ DeclChecker (*this ).visit (D);
6432
6357
}
6433
6358
6434
6359
// A class is @objc if it does not have generic ancestry, and it either has
0 commit comments