@@ -1295,14 +1295,28 @@ bool ExtensionDecl::isConstrainedExtension() const {
12951295bool ExtensionDecl::isEquivalentToExtendedContext () const {
12961296 auto decl = getExtendedNominal ();
12971297 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+ }
13031310 } 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+ }
13051318 }
1319+
13061320 return extendDeclFromSameModule
13071321 && !isConstrainedExtension ()
13081322 && !getDeclaredInterfaceType ()->isExistentialType ();
0 commit comments