@@ -1295,14 +1295,28 @@ bool ExtensionDecl::isConstrainedExtension() const {
1295
1295
bool ExtensionDecl::isEquivalentToExtendedContext () const {
1296
1296
auto decl = getExtendedNominal ();
1297
1297
bool extendDeclFromSameModule = false ;
1298
- if (!decl->getAlternateModuleName ().empty ()) {
1299
- // if the extended type was defined in the same module with the extension,
1300
- // we should consider them as the same module to preserve ABI stability.
1301
- extendDeclFromSameModule = decl->getAlternateModuleName () ==
1302
- getParentModule ()->getNameStr ();
1298
+ auto extensionAlterName = getAlternateModuleName ();
1299
+ auto typeAlterName = decl->getAlternateModuleName ();
1300
+
1301
+ if (!extensionAlterName.empty ()) {
1302
+ if (!typeAlterName.empty ()) {
1303
+ // Case I: type and extension are both moved from somewhere else
1304
+ extendDeclFromSameModule = typeAlterName == extensionAlterName;
1305
+ } else {
1306
+ // Case II: extension alone was moved from somewhere else
1307
+ extendDeclFromSameModule = extensionAlterName ==
1308
+ decl->getParentModule ()->getNameStr ();
1309
+ }
1303
1310
} else {
1304
- extendDeclFromSameModule = decl->getParentModule () == getParentModule ();
1311
+ if (!typeAlterName.empty ()) {
1312
+ // Case III: extended type alone was moved from somewhere else
1313
+ extendDeclFromSameModule = typeAlterName == getParentModule ()->getNameStr ();
1314
+ } else {
1315
+ // Case IV: neither of type and extension was moved from somewhere else
1316
+ extendDeclFromSameModule = getParentModule () == decl->getParentModule ();
1317
+ }
1305
1318
}
1319
+
1306
1320
return extendDeclFromSameModule
1307
1321
&& !isConstrainedExtension ()
1308
1322
&& !getDeclaredInterfaceType ()->isExistentialType ();
0 commit comments