Skip to content

Commit 6382572

Browse files
committed
Sema: DeclChecker::visitExtensionDecl() does everything in the 'first pass'
1 parent b7c1386 commit 6382572

File tree

1 file changed

+63
-61
lines changed

1 file changed

+63
-61
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 63 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -6193,81 +6193,83 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
61936193
}
61946194

61956195
void visitExtensionDecl(ExtensionDecl *ED) {
6196+
if (!IsFirstPass) {
6197+
for (Decl *Member : ED->getMembers())
6198+
visit(Member);
6199+
return;
6200+
}
6201+
61966202
TC.validateExtension(ED);
61976203

61986204
TC.checkDeclAttributesEarly(ED);
61996205

6200-
if (IsFirstPass) {
6201-
if (auto extendedTy = ED->getExtendedType()) {
6202-
if (!extendedTy->is<NominalType>() &&
6203-
!extendedTy->is<BoundGenericType>() &&
6204-
!extendedTy->hasError()) {
6205-
// FIXME: Redundant diagnostic test here?
6206-
TC.diagnose(ED->getStartLoc(), diag::non_nominal_extension,
6207-
extendedTy);
6208-
// FIXME: It would be nice to point out where we found the named type
6209-
// declaration, if any.
6210-
ED->setInvalid();
6206+
if (auto extendedTy = ED->getExtendedType()) {
6207+
if (!extendedTy->is<NominalType>() &&
6208+
!extendedTy->is<BoundGenericType>() &&
6209+
!extendedTy->hasError()) {
6210+
// FIXME: Redundant diagnostic test here?
6211+
TC.diagnose(ED->getStartLoc(), diag::non_nominal_extension,
6212+
extendedTy);
6213+
// FIXME: It would be nice to point out where we found the named type
6214+
// declaration, if any.
6215+
ED->setInvalid();
6216+
}
6217+
}
6218+
6219+
TC.checkInheritanceClause(ED);
6220+
if (auto extendedTy = ED->getExtendedType()) {
6221+
if (auto nominal = extendedTy->getAnyNominal()) {
6222+
TC.validateDecl(nominal);
6223+
if (auto *classDecl = dyn_cast<ClassDecl>(nominal))
6224+
TC.requestNominalLayout(classDecl);
6225+
6226+
// Check the raw values of an enum, since we might synthesize
6227+
// RawRepresentable while checking conformances on this extension.
6228+
if (auto enumDecl = dyn_cast<EnumDecl>(nominal)) {
6229+
if (enumDecl->hasRawType())
6230+
checkEnumRawValues(TC, enumDecl);
62116231
}
62126232
}
6213-
6214-
TC.checkInheritanceClause(ED);
6215-
if (auto extendedTy = ED->getExtendedType()) {
6216-
if (auto nominal = extendedTy->getAnyNominal()) {
6217-
TC.validateDecl(nominal);
6218-
if (auto *classDecl = dyn_cast<ClassDecl>(nominal))
6219-
TC.requestNominalLayout(classDecl);
6220-
6221-
// Check the raw values of an enum, since we might synthesize
6222-
// RawRepresentable while checking conformances on this extension.
6223-
if (auto enumDecl = dyn_cast<EnumDecl>(nominal)) {
6224-
if (enumDecl->hasRawType())
6225-
checkEnumRawValues(TC, enumDecl);
6226-
}
6227-
}
6228-
}
6229-
6230-
validateAttributes(TC, ED);
62316233
}
62326234

6233-
// Check conformances before visiting members, since we might
6234-
// synthesize bodies for derived conformances
6235-
if (!IsFirstPass) {
6236-
TC.computeDefaultAccessLevel(ED);
6237-
if (auto *AA = ED->getAttrs().getAttribute<AccessControlAttr>()) {
6238-
const auto access = AA->getAccess();
6239-
AccessScope desiredAccessScope = AccessScope::getPublic();
6240-
switch (access) {
6241-
case AccessLevel::Private:
6242-
assert((ED->isInvalid() ||
6243-
ED->getDeclContext()->isModuleScopeContext()) &&
6244-
"non-top-level extensions make 'private' != 'fileprivate'");
6245-
LLVM_FALLTHROUGH;
6246-
case AccessLevel::FilePrivate: {
6247-
const DeclContext *DC = ED->getModuleScopeContext();
6248-
bool isPrivate = access == AccessLevel::Private;
6249-
desiredAccessScope = AccessScope(DC, isPrivate);
6250-
break;
6251-
}
6252-
case AccessLevel::Internal:
6253-
desiredAccessScope = AccessScope(ED->getModuleContext());
6254-
break;
6255-
case AccessLevel::Public:
6256-
case AccessLevel::Open:
6257-
break;
6258-
}
6259-
checkGenericParamAccess(TC, ED->getGenericParams(), ED,
6260-
desiredAccessScope, access);
6261-
}
6262-
TC.checkConformancesInContext(ED, ED);
6263-
}
6235+
validateAttributes(TC, ED);
6236+
6237+
TC.computeDefaultAccessLevel(ED);
62646238

62656239
for (Decl *Member : ED->getMembers())
62666240
visit(Member);
62676241

6242+
TC.checkConformancesInContext(ED, ED);
6243+
62686244
if (!ED->isInvalid())
62696245
TC.checkDeclAttributes(ED);
6270-
}
6246+
6247+
if (auto *AA = ED->getAttrs().getAttribute<AccessControlAttr>()) {
6248+
const auto access = AA->getAccess();
6249+
AccessScope desiredAccessScope = AccessScope::getPublic();
6250+
switch (access) {
6251+
case AccessLevel::Private:
6252+
assert((ED->isInvalid() ||
6253+
ED->getDeclContext()->isModuleScopeContext()) &&
6254+
"non-top-level extensions make 'private' != 'fileprivate'");
6255+
LLVM_FALLTHROUGH;
6256+
case AccessLevel::FilePrivate: {
6257+
const DeclContext *DC = ED->getModuleScopeContext();
6258+
bool isPrivate = access == AccessLevel::Private;
6259+
desiredAccessScope = AccessScope(DC, isPrivate);
6260+
break;
6261+
}
6262+
case AccessLevel::Internal:
6263+
desiredAccessScope = AccessScope(ED->getModuleContext());
6264+
break;
6265+
case AccessLevel::Public:
6266+
case AccessLevel::Open:
6267+
break;
6268+
}
6269+
checkGenericParamAccess(TC, ED->getGenericParams(), ED,
6270+
desiredAccessScope, access);
6271+
}
6272+
}
62716273

62726274
void visitTopLevelCodeDecl(TopLevelCodeDecl *TLCD) {
62736275
// See swift::performTypeChecking for TopLevelCodeDecl handling.

0 commit comments

Comments
 (0)