Skip to content

Commit a61cd12

Browse files
authored
Merge pull request #15420 from slavapestov/decl-checker-cleanup-part-2
Kill off some usages of the DeclChecker::IsFirstPass bit
2 parents dd8c544 + 24ac4f5 commit a61cd12

File tree

7 files changed

+198
-261
lines changed

7 files changed

+198
-261
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2163,10 +2163,6 @@ ERROR(self_in_nominal,none,
21632163
"'Self' is only available in a protocol or as the result of a "
21642164
"method in a class; did you mean '%0'?", (StringRef))
21652165

2166-
// Duplicate declarations
2167-
ERROR(duplicate_enum_element,none,
2168-
"duplicate definition of enum element",())
2169-
21702166
// Property behaviors
21712167
ERROR(property_behavior_not_protocol,none,
21722168
"property behavior name must refer to a protocol", ())

lib/Sema/TypeCheckDecl.cpp

Lines changed: 117 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -4260,47 +4260,51 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
42604260
});
42614261
}
42624262

4263-
if (!IsFirstPass)
4264-
checkAccessControl(TC, PBD);
4265-
42664263
TC.checkDeclAttributes(PBD);
4264+
4265+
if (IsFirstPass)
4266+
checkAccessControl(TC, PBD);
42674267
}
42684268

42694269
void visitSubscriptDecl(SubscriptDecl *SD) {
42704270
if (!IsFirstPass) {
4271-
checkAccessControl(TC, SD);
42724271
return;
42734272
}
42744273

42754274
TC.validateDecl(SD);
4276-
42774275
TC.checkDeclAttributes(SD);
4276+
checkAccessControl(TC, SD);
42784277
}
42794278

42804279
void visitTypeAliasDecl(TypeAliasDecl *TAD) {
4280+
if (!IsFirstPass) {
4281+
return;
4282+
}
4283+
42814284
TC.checkDeclAttributesEarly(TAD);
42824285
TC.computeAccessLevel(TAD);
42834286

4284-
if (IsFirstPass)
4285-
TC.validateDecl(TAD);
4286-
4287-
if (!IsFirstPass)
4288-
checkAccessControl(TC, TAD);
4289-
4287+
TC.validateDecl(TAD);
42904288
TC.checkDeclAttributes(TAD);
4289+
checkAccessControl(TC, TAD);
42914290
}
42924291

4293-
void visitAssociatedTypeDecl(AssociatedTypeDecl *assocType) {
4294-
if (!assocType->hasValidationStarted())
4295-
TC.validateDecl(assocType);
4292+
void visitAssociatedTypeDecl(AssociatedTypeDecl *AT) {
4293+
if (!IsFirstPass) {
4294+
return;
4295+
}
42964296

4297-
auto *proto = assocType->getProtocol();
4297+
TC.validateDecl(AT);
4298+
4299+
auto *proto = AT->getProtocol();
42984300
if (proto->isObjC()) {
4299-
TC.diagnose(assocType->getLoc(),
4301+
TC.diagnose(AT->getLoc(),
43004302
diag::associated_type_objc,
4301-
assocType->getName(),
4303+
AT->getName(),
43024304
proto->getName());
43034305
}
4306+
4307+
checkAccessControl(TC, AT);
43044308
}
43054309

43064310
void checkUnsupportedNestedType(NominalTypeDecl *NTD) {
@@ -4366,28 +4370,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
43664370
checkCircularity(TC, ED, diag::circular_enum_inheritance,
43674371
diag::enum_here, path);
43684372
}
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-
}
43914373
}
43924374

43934375
if (!IsFirstPass) {
@@ -4401,7 +4383,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
44014383

44024384
TC.checkConformancesInContext(ED, ED);
44034385
}
4404-
4386+
44054387
for (Decl *member : ED->getMembers())
44064388
visit(member);
44074389

@@ -4410,29 +4392,31 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
44104392
}
44114393

44124394
void visitStructDecl(StructDecl *SD) {
4395+
if (!IsFirstPass) {
4396+
for (Decl *Member : SD->getMembers())
4397+
visit(Member);
4398+
4399+
return;
4400+
}
4401+
44134402
TC.checkDeclAttributesEarly(SD);
44144403
TC.computeAccessLevel(SD);
44154404

4416-
if (IsFirstPass) {
4417-
checkUnsupportedNestedType(SD);
4418-
4419-
TC.validateDecl(SD);
4420-
TC.DeclsToFinalize.remove(SD);
4421-
TC.addImplicitConstructors(SD);
4422-
}
4405+
checkUnsupportedNestedType(SD);
44234406

4424-
if (!IsFirstPass) {
4425-
checkAccessControl(TC, SD);
4407+
TC.validateDecl(SD);
4408+
TC.DeclsToFinalize.remove(SD);
44264409

4427-
if (!SD->isInvalid())
4428-
TC.checkConformancesInContext(SD, SD);
4429-
}
4410+
TC.addImplicitConstructors(SD);
44304411

4431-
// Visit each of the members.
44324412
for (Decl *Member : SD->getMembers())
44334413
visit(Member);
44344414

44354415
TC.checkDeclAttributes(SD);
4416+
checkAccessControl(TC, SD);
4417+
4418+
if (!SD->isInvalid())
4419+
TC.checkConformancesInContext(SD, SD);
44364420
}
44374421

44384422
/// Check whether the given properties can be @NSManaged in this class.
@@ -4674,26 +4658,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
46744658
}
46754659

46764660
void visitProtocolDecl(ProtocolDecl *PD) {
4677-
TC.checkDeclAttributesEarly(PD);
4678-
TC.computeAccessLevel(PD);
4679-
4680-
if (IsFirstPass) {
4681-
checkUnsupportedNestedType(PD);
4682-
}
4683-
46844661
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);
46944662
return;
46954663
}
46964664

4665+
TC.checkDeclAttributesEarly(PD);
4666+
TC.computeAccessLevel(PD);
4667+
4668+
checkUnsupportedNestedType(PD);
4669+
46974670
TC.validateDecl(PD);
46984671
if (!PD->hasValidSignature())
46994672
return;
@@ -4729,6 +4702,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47294702

47304703
TC.checkDeclAttributes(PD);
47314704

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+
47324714
if (TC.Context.LangOpts.DebugGenericSignatures) {
47334715
auto requirementsSig =
47344716
GenericSignature::get({PD->getProtocolSelfType()},
@@ -4795,14 +4777,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47954777
// Complain if we should have a body.
47964778
TC.diagnose(FD->getLoc(), diag::func_decl_without_brace);
47974779
}
4798-
}
47994780

4800-
if (!IsFirstPass) {
4801-
checkAccessControl(TC, FD);
48024781
return;
48034782
}
48044783

48054784
TC.validateDecl(FD);
4785+
checkAccessControl(TC, FD);
48064786
}
48074787

48084788

@@ -6206,90 +6186,92 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
62066186

62076187
void visitEnumElementDecl(EnumElementDecl *EED) {
62086188
if (!IsFirstPass) {
6209-
checkAccessControl(TC, EED);
62106189
return;
62116190
}
62126191

62136192
TC.validateDecl(EED);
62146193
TC.checkDeclAttributes(EED);
6194+
checkAccessControl(TC, EED);
62156195
}
62166196

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

62206206
TC.checkDeclAttributesEarly(ED);
62216207

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);
62336233
}
62346234
}
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);
62536235
}
62546236

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);
62866240

62876241
for (Decl *Member : ED->getMembers())
62886242
visit(Member);
62896243

6244+
TC.checkConformancesInContext(ED, ED);
6245+
62906246
if (!ED->isInvalid())
62916247
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+
}
62936275

62946276
void visitTopLevelCodeDecl(TopLevelCodeDecl *TLCD) {
62956277
// See swift::performTypeChecking for TopLevelCodeDecl handling.
@@ -6323,7 +6305,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
63236305
}
63246306

63256307
if (!IsFirstPass) {
6326-
checkAccessControl(TC, CD);
63276308
return;
63286309
}
63296310

@@ -6370,6 +6351,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
63706351
}
63716352

63726353
TC.checkDeclAttributes(CD);
6354+
checkAccessControl(TC, CD);
63736355
}
63746356

63756357
void visitDestructorDecl(DestructorDecl *DD) {

0 commit comments

Comments
 (0)