@@ -4260,47 +4260,51 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4260
4260
});
4261
4261
}
4262
4262
4263
- if (!IsFirstPass)
4264
- checkAccessControl (TC, PBD);
4265
-
4266
4263
TC.checkDeclAttributes (PBD);
4264
+
4265
+ if (IsFirstPass)
4266
+ checkAccessControl (TC, PBD);
4267
4267
}
4268
4268
4269
4269
void visitSubscriptDecl (SubscriptDecl *SD) {
4270
4270
if (!IsFirstPass) {
4271
- checkAccessControl (TC, SD);
4272
4271
return ;
4273
4272
}
4274
4273
4275
4274
TC.validateDecl (SD);
4276
-
4277
4275
TC.checkDeclAttributes (SD);
4276
+ checkAccessControl (TC, SD);
4278
4277
}
4279
4278
4280
4279
void visitTypeAliasDecl (TypeAliasDecl *TAD) {
4280
+ if (!IsFirstPass) {
4281
+ return ;
4282
+ }
4283
+
4281
4284
TC.checkDeclAttributesEarly (TAD);
4282
4285
TC.computeAccessLevel (TAD);
4283
4286
4284
- if (IsFirstPass)
4285
- TC.validateDecl (TAD);
4286
-
4287
- if (!IsFirstPass)
4288
- checkAccessControl (TC, TAD);
4289
-
4287
+ TC.validateDecl (TAD);
4290
4288
TC.checkDeclAttributes (TAD);
4289
+ checkAccessControl (TC, TAD);
4291
4290
}
4292
4291
4293
- void visitAssociatedTypeDecl (AssociatedTypeDecl *assocType) {
4294
- if (!assocType->hasValidationStarted ())
4295
- TC.validateDecl (assocType);
4292
+ void visitAssociatedTypeDecl (AssociatedTypeDecl *AT) {
4293
+ if (!IsFirstPass) {
4294
+ return ;
4295
+ }
4296
4296
4297
- auto *proto = assocType->getProtocol ();
4297
+ TC.validateDecl (AT);
4298
+
4299
+ auto *proto = AT->getProtocol ();
4298
4300
if (proto->isObjC ()) {
4299
- TC.diagnose (assocType ->getLoc (),
4301
+ TC.diagnose (AT ->getLoc (),
4300
4302
diag::associated_type_objc,
4301
- assocType ->getName (),
4303
+ AT ->getName (),
4302
4304
proto->getName ());
4303
4305
}
4306
+
4307
+ checkAccessControl (TC, AT);
4304
4308
}
4305
4309
4306
4310
void checkUnsupportedNestedType (NominalTypeDecl *NTD) {
@@ -4366,28 +4370,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4366
4370
checkCircularity (TC, ED, diag::circular_enum_inheritance,
4367
4371
diag::enum_here, path);
4368
4372
}
4369
- {
4370
- // Check for duplicate enum members.
4371
- llvm::DenseMap<Identifier, EnumElementDecl *> Elements;
4372
- bool hasErrors = false ;
4373
- for (auto *EED : ED->getAllElements ()) {
4374
- auto Res = Elements.insert ({ EED->getName (), EED });
4375
- if (!Res.second ) {
4376
- EED->setInvalid ();
4377
-
4378
- auto PreviousEED = Res.first ->second ;
4379
- TC.diagnose (EED->getLoc (), diag::duplicate_enum_element);
4380
- TC.diagnose (PreviousEED->getLoc (),
4381
- diag::previous_decldef, true , EED->getName ());
4382
- hasErrors = true ;
4383
- }
4384
- }
4385
-
4386
- // If one of the cases is invalid, let's mark
4387
- // whole enum as invalid as well.
4388
- if (hasErrors)
4389
- ED->setInvalid ();
4390
- }
4391
4373
}
4392
4374
4393
4375
if (!IsFirstPass) {
@@ -4401,7 +4383,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4401
4383
4402
4384
TC.checkConformancesInContext (ED, ED);
4403
4385
}
4404
-
4386
+
4405
4387
for (Decl *member : ED->getMembers ())
4406
4388
visit (member);
4407
4389
@@ -4410,29 +4392,31 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4410
4392
}
4411
4393
4412
4394
void visitStructDecl (StructDecl *SD) {
4395
+ if (!IsFirstPass) {
4396
+ for (Decl *Member : SD->getMembers ())
4397
+ visit (Member);
4398
+
4399
+ return ;
4400
+ }
4401
+
4413
4402
TC.checkDeclAttributesEarly (SD);
4414
4403
TC.computeAccessLevel (SD);
4415
4404
4416
- if (IsFirstPass) {
4417
- checkUnsupportedNestedType (SD);
4418
-
4419
- TC.validateDecl (SD);
4420
- TC.DeclsToFinalize .remove (SD);
4421
- TC.addImplicitConstructors (SD);
4422
- }
4405
+ checkUnsupportedNestedType (SD);
4423
4406
4424
- if (!IsFirstPass) {
4425
- checkAccessControl (TC, SD);
4407
+ TC. validateDecl (SD);
4408
+ TC. DeclsToFinalize . remove ( SD);
4426
4409
4427
- if (!SD->isInvalid ())
4428
- TC.checkConformancesInContext (SD, SD);
4429
- }
4410
+ TC.addImplicitConstructors (SD);
4430
4411
4431
- // Visit each of the members.
4432
4412
for (Decl *Member : SD->getMembers ())
4433
4413
visit (Member);
4434
4414
4435
4415
TC.checkDeclAttributes (SD);
4416
+ checkAccessControl (TC, SD);
4417
+
4418
+ if (!SD->isInvalid ())
4419
+ TC.checkConformancesInContext (SD, SD);
4436
4420
}
4437
4421
4438
4422
// / Check whether the given properties can be @NSManaged in this class.
@@ -4674,26 +4658,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4674
4658
}
4675
4659
4676
4660
void visitProtocolDecl (ProtocolDecl *PD) {
4677
- TC.checkDeclAttributesEarly (PD);
4678
- TC.computeAccessLevel (PD);
4679
-
4680
- if (IsFirstPass) {
4681
- checkUnsupportedNestedType (PD);
4682
- }
4683
-
4684
4661
if (!IsFirstPass) {
4685
- checkAccessControl (TC, PD);
4686
- for (auto member : PD->getMembers ()) {
4687
- TC.checkUnsupportedProtocolType (member);
4688
- checkAccessControl (TC, member);
4689
- }
4690
- TC.checkInheritanceClause (PD);
4691
-
4692
- GenericTypeToArchetypeResolver resolver (PD);
4693
- TC.validateWhereClauses (PD, &resolver);
4694
4662
return ;
4695
4663
}
4696
4664
4665
+ TC.checkDeclAttributesEarly (PD);
4666
+ TC.computeAccessLevel (PD);
4667
+
4668
+ checkUnsupportedNestedType (PD);
4669
+
4697
4670
TC.validateDecl (PD);
4698
4671
if (!PD->hasValidSignature ())
4699
4672
return ;
@@ -4729,6 +4702,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4729
4702
4730
4703
TC.checkDeclAttributes (PD);
4731
4704
4705
+ checkAccessControl (TC, PD);
4706
+ for (auto member : PD->getMembers ()) {
4707
+ TC.checkUnsupportedProtocolType (member);
4708
+ }
4709
+ TC.checkInheritanceClause (PD);
4710
+
4711
+ GenericTypeToArchetypeResolver resolver (PD);
4712
+ TC.validateWhereClauses (PD, &resolver);
4713
+
4732
4714
if (TC.Context .LangOpts .DebugGenericSignatures ) {
4733
4715
auto requirementsSig =
4734
4716
GenericSignature::get ({PD->getProtocolSelfType ()},
@@ -4795,14 +4777,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
4795
4777
// Complain if we should have a body.
4796
4778
TC.diagnose (FD->getLoc (), diag::func_decl_without_brace);
4797
4779
}
4798
- }
4799
4780
4800
- if (!IsFirstPass) {
4801
- checkAccessControl (TC, FD);
4802
4781
return ;
4803
4782
}
4804
4783
4805
4784
TC.validateDecl (FD);
4785
+ checkAccessControl (TC, FD);
4806
4786
}
4807
4787
4808
4788
@@ -6206,90 +6186,92 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
6206
6186
6207
6187
void visitEnumElementDecl (EnumElementDecl *EED) {
6208
6188
if (!IsFirstPass) {
6209
- checkAccessControl (TC, EED);
6210
6189
return ;
6211
6190
}
6212
6191
6213
6192
TC.validateDecl (EED);
6214
6193
TC.checkDeclAttributes (EED);
6194
+ checkAccessControl (TC, EED);
6215
6195
}
6216
6196
6217
6197
void visitExtensionDecl (ExtensionDecl *ED) {
6198
+ if (!IsFirstPass) {
6199
+ for (Decl *Member : ED->getMembers ())
6200
+ visit (Member);
6201
+ return ;
6202
+ }
6203
+
6218
6204
TC.validateExtension (ED);
6219
6205
6220
6206
TC.checkDeclAttributesEarly (ED);
6221
6207
6222
- if (IsFirstPass) {
6223
- if (auto extendedTy = ED->getExtendedType ()) {
6224
- if (!extendedTy->is <NominalType>() &&
6225
- !extendedTy->is <BoundGenericType>() &&
6226
- !extendedTy->hasError ()) {
6227
- // FIXME: Redundant diagnostic test here?
6228
- TC.diagnose (ED->getStartLoc (), diag::non_nominal_extension,
6229
- extendedTy);
6230
- // FIXME: It would be nice to point out where we found the named type
6231
- // declaration, if any.
6232
- ED->setInvalid ();
6208
+ if (auto extendedTy = ED->getExtendedType ()) {
6209
+ if (!extendedTy->is <NominalType>() &&
6210
+ !extendedTy->is <BoundGenericType>() &&
6211
+ !extendedTy->hasError ()) {
6212
+ // FIXME: Redundant diagnostic test here?
6213
+ TC.diagnose (ED->getStartLoc (), diag::non_nominal_extension,
6214
+ extendedTy);
6215
+ // FIXME: It would be nice to point out where we found the named type
6216
+ // declaration, if any.
6217
+ ED->setInvalid ();
6218
+ }
6219
+ }
6220
+
6221
+ TC.checkInheritanceClause (ED);
6222
+ if (auto extendedTy = ED->getExtendedType ()) {
6223
+ if (auto nominal = extendedTy->getAnyNominal ()) {
6224
+ TC.validateDecl (nominal);
6225
+ if (auto *classDecl = dyn_cast<ClassDecl>(nominal))
6226
+ TC.requestNominalLayout (classDecl);
6227
+
6228
+ // Check the raw values of an enum, since we might synthesize
6229
+ // RawRepresentable while checking conformances on this extension.
6230
+ if (auto enumDecl = dyn_cast<EnumDecl>(nominal)) {
6231
+ if (enumDecl->hasRawType ())
6232
+ checkEnumRawValues (TC, enumDecl);
6233
6233
}
6234
6234
}
6235
-
6236
- TC.checkInheritanceClause (ED);
6237
- if (auto extendedTy = ED->getExtendedType ()) {
6238
- if (auto nominal = extendedTy->getAnyNominal ()) {
6239
- TC.validateDecl (nominal);
6240
- if (auto *classDecl = dyn_cast<ClassDecl>(nominal))
6241
- TC.requestNominalLayout (classDecl);
6242
-
6243
- // Check the raw values of an enum, since we might synthesize
6244
- // RawRepresentable while checking conformances on this extension.
6245
- if (auto enumDecl = dyn_cast<EnumDecl>(nominal)) {
6246
- if (enumDecl->hasRawType ())
6247
- checkEnumRawValues (TC, enumDecl);
6248
- }
6249
- }
6250
- }
6251
-
6252
- validateAttributes (TC, ED);
6253
6235
}
6254
6236
6255
- // Check conformances before visiting members, since we might
6256
- // synthesize bodies for derived conformances
6257
- if (!IsFirstPass) {
6258
- TC.computeDefaultAccessLevel (ED);
6259
- if (auto *AA = ED->getAttrs ().getAttribute <AccessControlAttr>()) {
6260
- const auto access = AA->getAccess ();
6261
- AccessScope desiredAccessScope = AccessScope::getPublic ();
6262
- switch (access) {
6263
- case AccessLevel::Private:
6264
- assert ((ED->isInvalid () ||
6265
- ED->getDeclContext ()->isModuleScopeContext ()) &&
6266
- " non-top-level extensions make 'private' != 'fileprivate'" );
6267
- LLVM_FALLTHROUGH;
6268
- case AccessLevel::FilePrivate: {
6269
- const DeclContext *DC = ED->getModuleScopeContext ();
6270
- bool isPrivate = access == AccessLevel::Private;
6271
- desiredAccessScope = AccessScope (DC, isPrivate);
6272
- break ;
6273
- }
6274
- case AccessLevel::Internal:
6275
- desiredAccessScope = AccessScope (ED->getModuleContext ());
6276
- break ;
6277
- case AccessLevel::Public:
6278
- case AccessLevel::Open:
6279
- break ;
6280
- }
6281
- checkGenericParamAccess (TC, ED->getGenericParams (), ED,
6282
- desiredAccessScope, access);
6283
- }
6284
- TC.checkConformancesInContext (ED, ED);
6285
- }
6237
+ validateAttributes (TC, ED);
6238
+
6239
+ TC.computeDefaultAccessLevel (ED);
6286
6240
6287
6241
for (Decl *Member : ED->getMembers ())
6288
6242
visit (Member);
6289
6243
6244
+ TC.checkConformancesInContext (ED, ED);
6245
+
6290
6246
if (!ED->isInvalid ())
6291
6247
TC.checkDeclAttributes (ED);
6292
- }
6248
+
6249
+ if (auto *AA = ED->getAttrs ().getAttribute <AccessControlAttr>()) {
6250
+ const auto access = AA->getAccess ();
6251
+ AccessScope desiredAccessScope = AccessScope::getPublic ();
6252
+ switch (access) {
6253
+ case AccessLevel::Private:
6254
+ assert ((ED->isInvalid () ||
6255
+ ED->getDeclContext ()->isModuleScopeContext ()) &&
6256
+ " non-top-level extensions make 'private' != 'fileprivate'" );
6257
+ LLVM_FALLTHROUGH;
6258
+ case AccessLevel::FilePrivate: {
6259
+ const DeclContext *DC = ED->getModuleScopeContext ();
6260
+ bool isPrivate = access == AccessLevel::Private;
6261
+ desiredAccessScope = AccessScope (DC, isPrivate);
6262
+ break ;
6263
+ }
6264
+ case AccessLevel::Internal:
6265
+ desiredAccessScope = AccessScope (ED->getModuleContext ());
6266
+ break ;
6267
+ case AccessLevel::Public:
6268
+ case AccessLevel::Open:
6269
+ break ;
6270
+ }
6271
+ checkGenericParamAccess (TC, ED->getGenericParams (), ED,
6272
+ desiredAccessScope, access);
6273
+ }
6274
+ }
6293
6275
6294
6276
void visitTopLevelCodeDecl (TopLevelCodeDecl *TLCD) {
6295
6277
// See swift::performTypeChecking for TopLevelCodeDecl handling.
@@ -6323,7 +6305,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
6323
6305
}
6324
6306
6325
6307
if (!IsFirstPass) {
6326
- checkAccessControl (TC, CD);
6327
6308
return ;
6328
6309
}
6329
6310
@@ -6370,6 +6351,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
6370
6351
}
6371
6352
6372
6353
TC.checkDeclAttributes (CD);
6354
+ checkAccessControl (TC, CD);
6373
6355
}
6374
6356
6375
6357
void visitDestructorDecl (DestructorDecl *DD) {
0 commit comments