@@ -6193,81 +6193,83 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
6193
6193
}
6194
6194
6195
6195
void visitExtensionDecl (ExtensionDecl *ED) {
6196
+ if (!IsFirstPass) {
6197
+ for (Decl *Member : ED->getMembers ())
6198
+ visit (Member);
6199
+ return ;
6200
+ }
6201
+
6196
6202
TC.validateExtension (ED);
6197
6203
6198
6204
TC.checkDeclAttributesEarly (ED);
6199
6205
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);
6211
6231
}
6212
6232
}
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);
6231
6233
}
6232
6234
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);
6264
6238
6265
6239
for (Decl *Member : ED->getMembers ())
6266
6240
visit (Member);
6267
6241
6242
+ TC.checkConformancesInContext (ED, ED);
6243
+
6268
6244
if (!ED->isInvalid ())
6269
6245
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
+ }
6271
6273
6272
6274
void visitTopLevelCodeDecl (TopLevelCodeDecl *TLCD) {
6273
6275
// See swift::performTypeChecking for TopLevelCodeDecl handling.
0 commit comments