@@ -264,11 +264,15 @@ Type ASTBuilder::resolveOpaqueType(NodePointer opaqueDescriptor,
264264 auto moduleNode = findModuleNode (definingDecl);
265265 if (!moduleNode)
266266 return Type ();
267- auto parentModule = findModule (moduleNode);
268- if (!parentModule )
267+ auto potentialParentModules = findPotentialModules (moduleNode);
268+ if (potentialParentModules. empty () )
269269 return Type ();
270270
271- auto opaqueDecl = parentModule->lookupOpaqueResultType (mangledName);
271+ OpaqueTypeDecl *opaqueDecl = nullptr ;
272+ for (auto module : potentialParentModules)
273+ if (auto decl = module ->lookupOpaqueResultType (mangledName))
274+ opaqueDecl = decl;
275+
272276 if (!opaqueDecl)
273277 return Type ();
274278 SmallVector<Type, 8 > allArgs;
@@ -1123,17 +1127,11 @@ ASTBuilder::createTypeDecl(NodePointer node,
11231127 return dyn_cast<GenericTypeDecl>(DC);
11241128}
11251129
1126- ModuleDecl *ASTBuilder::findModule (NodePointer node) {
1130+ llvm::ArrayRef<ModuleDecl *>
1131+ ASTBuilder::findPotentialModules (NodePointer node) {
11271132 assert (node->getKind () == Demangle::Node::Kind::Module);
11281133 const auto moduleName = node->getText ();
1129- // Respect the module's ABI name when we're trying to resolve
1130- // mangled names. But don't touch anything under the Swift stdlib's
1131- // umbrella.
1132- if (moduleName != STDLIB_NAME)
1133- if (auto *Module = Ctx.getLoadedModuleByABIName (moduleName))
1134- return Module;
1135-
1136- return Ctx.getModuleByName (moduleName);
1134+ return Ctx.getModulesByRealOrABIName (moduleName);
11371135}
11381136
11391137Demangle::NodePointer
@@ -1223,8 +1221,17 @@ ASTBuilder::findDeclContext(NodePointer node) {
12231221 case Demangle::Node::Kind::BoundGenericTypeAlias:
12241222 return findDeclContext (node->getFirstChild ());
12251223
1226- case Demangle::Node::Kind::Module:
1227- return findModule (node);
1224+ case Demangle::Node::Kind::Module: {
1225+ // A Module node is not enough information to find the decl context.
1226+ // The reason being that the module name in a mangled name can either be
1227+ // the module's ABI name, which is potentially not unique (due to the
1228+ // -module-abi-name flag), or the module's real name, if mangling for the
1229+ // debugger or USR together with the OriginallyDefinedIn attribute for
1230+ // example.
1231+ assert (false && " Looked up module as decl context directly!" );
1232+ auto modules = findPotentialModules (node);
1233+ return modules.empty () ? nullptr : modules[0 ];
1234+ }
12281235
12291236 case Demangle::Node::Kind::Class:
12301237 case Demangle::Node::Kind::Enum:
@@ -1237,20 +1244,24 @@ ASTBuilder::findDeclContext(NodePointer node) {
12371244 if (declNameNode->getKind () == Demangle::Node::Kind::LocalDeclName) {
12381245 // Find the AST node for the defining module.
12391246 auto moduleNode = findModuleNode (node);
1240- if (!moduleNode) return nullptr ;
1247+ if (!moduleNode)
1248+ return nullptr ;
12411249
1242- auto module = findModule (moduleNode);
1243- if (!module ) return nullptr ;
1250+ auto potentialModules = findPotentialModules (moduleNode);
1251+ if (potentialModules.empty ())
1252+ return nullptr ;
12441253
12451254 // Look up the local type by its mangling.
12461255 auto mangling = Demangle::mangleNode (node);
1247- if (!mangling.isSuccess ()) return nullptr ;
1256+ if (!mangling.isSuccess ())
1257+ return nullptr ;
12481258 auto mangledName = mangling.result ();
12491259
1250- auto decl = module ->lookupLocalType (mangledName);
1251- if (!decl) return nullptr ;
1260+ for (auto *module : potentialModules)
1261+ if (auto *decl = module ->lookupLocalType (mangledName))
1262+ return dyn_cast<DeclContext>(decl);
12521263
1253- return dyn_cast<DeclContext>(decl) ;
1264+ return nullptr ;
12541265 }
12551266
12561267 StringRef name;
@@ -1284,22 +1295,33 @@ ASTBuilder::findDeclContext(NodePointer node) {
12841295 }
12851296 }
12861297
1287- DeclContext *dc = findDeclContext (node->getChild (0 ));
1288- if (!dc) {
1298+ auto child = node->getFirstChild ();
1299+ if (child->getKind () == Node::Kind::Module) {
1300+ auto potentialModules = findPotentialModules (child);
1301+ if (potentialModules.empty ())
1302+ return nullptr ;
1303+
1304+ for (auto *module : potentialModules)
1305+ if (auto typeDecl = findTypeDecl (module , Ctx.getIdentifier (name),
1306+ privateDiscriminator, node->getKind ()))
1307+ return typeDecl;
12891308 return nullptr ;
12901309 }
12911310
1292- return findTypeDecl (dc, Ctx.getIdentifier (name),
1293- privateDiscriminator, node->getKind ());
1311+ if (auto *dc = findDeclContext (child))
1312+ if (auto typeDecl = findTypeDecl (dc, Ctx.getIdentifier (name),
1313+ privateDiscriminator, node->getKind ()))
1314+ return typeDecl;
1315+
1316+ return nullptr ;
12941317 }
12951318
12961319 case Demangle::Node::Kind::Global:
12971320 return findDeclContext (node->getChild (0 ));
12981321
12991322 case Demangle::Node::Kind::Extension: {
1300- auto *moduleDecl = dyn_cast_or_null<ModuleDecl>(
1301- findDeclContext (node->getChild (0 )));
1302- if (!moduleDecl)
1323+ auto moduleDecls = findPotentialModules (node->getFirstChild ());
1324+ if (moduleDecls.empty ())
13031325 return nullptr ;
13041326
13051327 auto *nominalDecl = dyn_cast_or_null<NominalTypeDecl>(
@@ -1321,14 +1343,23 @@ ASTBuilder::findDeclContext(NodePointer node) {
13211343 // If the generic signature is equivalent to that of the nominal type,
13221344 // and we're in the same module, it's due to inverse requirements.
13231345 // Just return the nominal declaration.
1324- if (genericSigMatchesNominal &&
1325- nominalDecl->getParentModule () == moduleDecl) {
1326- return nominalDecl;
1346+ for (auto *moduleDecl : moduleDecls) {
1347+ if (genericSigMatchesNominal &&
1348+ nominalDecl->getParentModule () == moduleDecl) {
1349+ return nominalDecl;;
1350+ }
13271351 }
13281352 }
13291353
13301354 for (auto *ext : nominalDecl->getExtensions ()) {
1331- if (ext->getParentModule () != moduleDecl)
1355+ bool found = false ;
1356+ for (ModuleDecl *module : moduleDecls) {
1357+ if (ext->getParentModule () == module ) {
1358+ found = true ;
1359+ break ;
1360+ }
1361+ }
1362+ if (!found)
13321363 continue ;
13331364
13341365 if (!ext->isConstrainedExtension ()) {
0 commit comments