@@ -1207,6 +1207,21 @@ static void filterValues(Type expectedTy, ModuleDecl *expectedModule,
1207
1207
values.erase (newEnd, values.end ());
1208
1208
}
1209
1209
1210
+ static TypeDecl *
1211
+ findNestedTypeDeclInModule (FileUnit *thisFile, ModuleDecl *extensionModule,
1212
+ Identifier name, NominalTypeDecl *parent) {
1213
+ assert (extensionModule && " NULL is not a valid module" );
1214
+ for (FileUnit *file : extensionModule->getFiles ()) {
1215
+ if (file == thisFile)
1216
+ continue ;
1217
+
1218
+ if (auto nestedType = file->lookupNestedType (name, parent)) {
1219
+ return nestedType;
1220
+ }
1221
+ }
1222
+ return nullptr ;
1223
+ }
1224
+
1210
1225
Expected<Decl *>
1211
1226
ModuleFile::resolveCrossReference (ModuleID MID, uint32_t pathLen) {
1212
1227
using namespace decls_block ;
@@ -1442,13 +1457,19 @@ ModuleFile::resolveCrossReference(ModuleID MID, uint32_t pathLen) {
1442
1457
1443
1458
// Fault in extensions, then ask every file in the module.
1444
1459
(void )baseType->getExtensions ();
1445
- TypeDecl *nestedType = nullptr ;
1446
- for (FileUnit *file : extensionModule->getFiles ()) {
1447
- if (file == getFile ())
1448
- continue ;
1449
- nestedType = file->lookupNestedType (memberName, baseType);
1450
- if (nestedType)
1451
- break ;
1460
+ auto *nestedType =
1461
+ findNestedTypeDeclInModule (getFile (), extensionModule,
1462
+ memberName, baseType);
1463
+
1464
+ // For clang module units, also search tables in the overlays.
1465
+ if (!nestedType) {
1466
+ if (auto LF =
1467
+ dyn_cast<LoadedFile>(baseType->getModuleScopeContext ())) {
1468
+ if (auto overlayModule = LF->getOverlayModule ()) {
1469
+ nestedType = findNestedTypeDeclInModule (getFile (), overlayModule,
1470
+ memberName, baseType);
1471
+ }
1472
+ }
1452
1473
}
1453
1474
1454
1475
if (nestedType) {
0 commit comments