@@ -1326,14 +1326,28 @@ bool ExtensionDecl::isConstrainedExtension() const {
1326
1326
bool ExtensionDecl::isEquivalentToExtendedContext () const {
1327
1327
auto decl = getExtendedNominal ();
1328
1328
bool extendDeclFromSameModule = false ;
1329
- if (!decl->getAlternateModuleName ().empty ()) {
1330
- // if the extended type was defined in the same module with the extension,
1331
- // we should consider them as the same module to preserve ABI stability.
1332
- extendDeclFromSameModule = decl->getAlternateModuleName () ==
1333
- getParentModule ()->getNameStr ();
1329
+ auto extensionAlterName = getAlternateModuleName ();
1330
+ auto typeAlterName = decl->getAlternateModuleName ();
1331
+
1332
+ if (!extensionAlterName.empty ()) {
1333
+ if (!typeAlterName.empty ()) {
1334
+ // Case I: type and extension are both moved from somewhere else
1335
+ extendDeclFromSameModule = typeAlterName == extensionAlterName;
1336
+ } else {
1337
+ // Case II: extension alone was moved from somewhere else
1338
+ extendDeclFromSameModule = extensionAlterName ==
1339
+ decl->getParentModule ()->getNameStr ();
1340
+ }
1334
1341
} else {
1335
- extendDeclFromSameModule = decl->getParentModule () == getParentModule ();
1342
+ if (!typeAlterName.empty ()) {
1343
+ // Case III: extended type alone was moved from somewhere else
1344
+ extendDeclFromSameModule = typeAlterName == getParentModule ()->getNameStr ();
1345
+ } else {
1346
+ // Case IV: neither of type and extension was moved from somewhere else
1347
+ extendDeclFromSameModule = getParentModule () == decl->getParentModule ();
1348
+ }
1336
1349
}
1350
+
1337
1351
return extendDeclFromSameModule
1338
1352
&& !isConstrainedExtension ()
1339
1353
&& !getDeclaredInterfaceType ()->isExistentialType ();
0 commit comments