@@ -1099,31 +1099,10 @@ static bool inferFinalAndDiagnoseIfNeeded(ValueDecl *D, ClassDecl *cls,
1099
1099
return true ;
1100
1100
}
1101
1101
1102
- // / Make the given declaration 'dynamic', if it isn't already marked as such.
1103
- static void makeDynamic (ValueDecl *decl) {
1104
- // If there isn't already a 'dynamic' attribute, add an inferred one.
1105
- if (decl->getAttrs ().hasAttribute <DynamicAttr>())
1106
- return ;
1107
-
1108
- auto attr = new (decl->getASTContext ()) DynamicAttr (/* implicit=*/ true );
1109
- decl->getAttrs ().add (attr);
1110
- }
1111
-
1112
- static llvm::Expected<bool > isStorageDynamic (Evaluator &evaluator,
1113
- AccessorDecl *accessor) {
1114
- auto isDynamicResult = evaluator (IsDynamicRequest{accessor->getStorage ()});
1115
-
1116
- if (!isDynamicResult)
1117
- return isDynamicResult;
1118
-
1119
- return *isDynamicResult;
1120
- }
1121
-
1122
1102
// / Runtime-replacable accessors are dynamic when their storage declaration
1123
1103
// / is dynamic and they were explicitly defined or they are implicitly defined
1124
1104
// / getter/setter because no accessor was defined.
1125
- static llvm::Expected<bool >
1126
- doesAccessorNeedDynamicAttribute (AccessorDecl *accessor, Evaluator &evaluator) {
1105
+ static bool doesAccessorNeedDynamicAttribute (AccessorDecl *accessor) {
1127
1106
auto kind = accessor->getAccessorKind ();
1128
1107
auto storage = accessor->getStorage ();
1129
1108
bool isObjC = storage->isObjC ();
@@ -1134,40 +1113,40 @@ doesAccessorNeedDynamicAttribute(AccessorDecl *accessor, Evaluator &evaluator) {
1134
1113
if (!isObjC &&
1135
1114
(readImpl == ReadImplKind::Read || readImpl == ReadImplKind::Address))
1136
1115
return false ;
1137
- return isStorageDynamic (evaluator, accessor );
1116
+ return storage-> isDynamic ( );
1138
1117
}
1139
1118
case AccessorKind::Set: {
1140
1119
auto writeImpl = storage->getWriteImpl ();
1141
1120
if (!isObjC && (writeImpl == WriteImplKind::Modify ||
1142
1121
writeImpl == WriteImplKind::MutableAddress ||
1143
1122
writeImpl == WriteImplKind::StoredWithObservers))
1144
1123
return false ;
1145
- return isStorageDynamic (evaluator, accessor );
1124
+ return storage-> isDynamic ( );
1146
1125
}
1147
1126
case AccessorKind::Read:
1148
1127
if (!isObjC && storage->getReadImpl () == ReadImplKind::Read)
1149
- return isStorageDynamic (evaluator, accessor );
1128
+ return storage-> isDynamic ( );
1150
1129
return false ;
1151
1130
case AccessorKind::Modify: {
1152
1131
if (!isObjC && storage->getWriteImpl () == WriteImplKind::Modify)
1153
- return isStorageDynamic (evaluator, accessor );
1132
+ return storage-> isDynamic ( );
1154
1133
return false ;
1155
1134
}
1156
1135
case AccessorKind::MutableAddress: {
1157
1136
if (!isObjC && storage->getWriteImpl () == WriteImplKind::MutableAddress)
1158
- return isStorageDynamic (evaluator, accessor );
1137
+ return storage-> isDynamic ( );
1159
1138
return false ;
1160
1139
}
1161
1140
case AccessorKind::Address: {
1162
1141
if (!isObjC && storage->getReadImpl () == ReadImplKind::Address)
1163
- return isStorageDynamic (evaluator, accessor );
1142
+ return storage-> isDynamic ( );
1164
1143
return false ;
1165
1144
}
1166
1145
case AccessorKind::DidSet:
1167
1146
case AccessorKind::WillSet:
1168
1147
if (!isObjC &&
1169
1148
storage->getWriteImpl () == WriteImplKind::StoredWithObservers)
1170
- return isStorageDynamic (evaluator, accessor );
1149
+ return storage-> isDynamic ( );
1171
1150
return false ;
1172
1151
}
1173
1152
llvm_unreachable (" covered switch" );
@@ -1284,40 +1263,17 @@ IsDynamicRequest::evaluate(Evaluator &evaluator, ValueDecl *decl) const {
1284
1263
}
1285
1264
1286
1265
if (auto accessor = dyn_cast<AccessorDecl>(decl)) {
1287
- // Swift 5: Runtime-replacable accessors are dynamic when their storage declaration
1266
+ // Runtime-replacable accessors are dynamic when their storage declaration
1288
1267
// is dynamic and they were explicitly defined or they are implicitly defined
1289
1268
// getter/setter because no accessor was defined.
1290
- if (decl->getASTContext ().LangOpts .isSwiftVersionAtLeast (5 ))
1291
- return doesAccessorNeedDynamicAttribute (accessor, evaluator);
1292
-
1293
- // Pre Swift 5: Runtime-replacable accessors are dynamic when their storage declaration
1294
- // is dynamic. Other accessors are never dynamic.
1295
- switch (accessor->getAccessorKind ()) {
1296
- case AccessorKind::Get:
1297
- case AccessorKind::Set: {
1298
- auto isDynamicResult = evaluator (
1299
- IsDynamicRequest{accessor->getStorage ()});
1300
- if (isDynamicResult && *isDynamicResult)
1301
- makeDynamic (decl);
1302
-
1303
- return isDynamicResult;
1304
- }
1305
-
1306
- #define OBJC_ACCESSOR (ID, KEYWORD )
1307
- #define ACCESSOR (ID ) \
1308
- case AccessorKind::ID:
1309
- #include " swift/AST/AccessorKinds.def"
1310
- return false ;
1311
- }
1269
+ return doesAccessorNeedDynamicAttribute (accessor);
1312
1270
}
1313
1271
1314
1272
// The 'NSManaged' attribute implies 'dynamic'.
1315
1273
// FIXME: Use a semantic check for NSManaged rather than looking for the
1316
1274
// attribute (which could be ill-formed).
1317
- if (decl->getAttrs ().hasAttribute <NSManagedAttr>()) {
1318
- makeDynamic (decl);
1275
+ if (decl->getAttrs ().hasAttribute <NSManagedAttr>())
1319
1276
return true ;
1320
- }
1321
1277
1322
1278
// The presence of 'final' blocks the inference of 'dynamic'.
1323
1279
if (decl->isFinal ())
@@ -1334,10 +1290,8 @@ IsDynamicRequest::evaluate(Evaluator &evaluator, ValueDecl *decl) const {
1334
1290
// @objc declarations in class extensions are implicitly dynamic.
1335
1291
// This is intended to enable overriding the declarations.
1336
1292
auto dc = decl->getDeclContext ();
1337
- if (isa<ExtensionDecl>(dc) && dc->getSelfClassDecl ()) {
1338
- makeDynamic (decl);
1293
+ if (isa<ExtensionDecl>(dc) && dc->getSelfClassDecl ())
1339
1294
return true ;
1340
- }
1341
1295
1342
1296
// If any of the declarations overridden by this declaration are dynamic
1343
1297
// or were imported from Objective-C, this declaration is dynamic.
@@ -1347,10 +1301,8 @@ IsDynamicRequest::evaluate(Evaluator &evaluator, ValueDecl *decl) const {
1347
1301
auto overriddenDecls = evaluateOrDefault (evaluator,
1348
1302
OverriddenDeclsRequest{decl}, {});
1349
1303
for (auto overridden : overriddenDecls) {
1350
- if (overridden->isDynamic () || overridden->hasClangNode ()) {
1351
- makeDynamic (decl);
1304
+ if (overridden->isDynamic () || overridden->hasClangNode ())
1352
1305
return true ;
1353
- }
1354
1306
}
1355
1307
1356
1308
return false ;
0 commit comments