@@ -83,9 +83,7 @@ namespace {
83
83
void handleImport (const clang::Module *imported) {
84
84
if (!imported)
85
85
return ;
86
- ModuleDecl *nativeImported = Impl.finishLoadingClangModule (Importer, imported,
87
- /* preferAdapter=*/ true );
88
- Impl.ImportedHeaderExports .push_back ({ /* filter=*/ {}, nativeImported });
86
+ Impl.DeferredHeaderImports .push_back (imported);
89
87
}
90
88
91
89
void InclusionDirective (clang::SourceLocation HashLoc,
@@ -835,7 +833,7 @@ ClangImporter::create(ASTContext &ctx,
835
833
// Set up the imported header module.
836
834
auto *importedHeaderModule = ModuleDecl::create (ctx.getIdentifier (" __ObjC" ), ctx);
837
835
importer->Impl .ImportedHeaderUnit =
838
- new (ctx) ClangModuleUnit (*importedHeaderModule, * importer, nullptr );
836
+ new (ctx) ClangModuleUnit (*importedHeaderModule, importer-> Impl , nullptr );
839
837
importedHeaderModule->addFile (*importer->Impl .ImportedHeaderUnit );
840
838
841
839
importer->Impl .IsReadingBridgingPCH = false ;
@@ -963,6 +961,9 @@ bool ClangImporter::Implementation::importHeader(
963
961
// Add any defined macros to the bridging header lookup table.
964
962
addMacrosToLookupTable (*BridgingHeaderLookupTable, getNameImporter ());
965
963
964
+ // Finish loading any extra modules that were (transitively) imported.
965
+ handleDeferredImports ();
966
+
966
967
// Wrap all Clang imports under a Swift import decl.
967
968
for (auto &Import : BridgeHeaderTopLevelImports) {
968
969
if (auto *ClangImport = Import.dyn_cast <clang::ImportDecl*>()) {
@@ -1008,16 +1009,11 @@ bool ClangImporter::importBridgingHeader(StringRef header, ModuleDecl *adapter,
1008
1009
bool trackParsedSymbols,
1009
1010
bool implicitImport) {
1010
1011
if (llvm::sys::path::extension (header).endswith (PCH_EXTENSION)) {
1011
- // We already imported this with -include-pch above, so we should have
1012
- // collected a bunch of PCH-encoded module imports that we need to
1013
- // replay to the HeaderImportCallbacks for processing.
1014
1012
Impl.ImportedHeaderOwners .push_back (adapter);
1015
- clang::ASTReader &R = *Impl.Instance ->getModuleManager ();
1016
- HeaderImportCallbacks CB (*this , Impl);
1017
- for (auto ID : Impl.PCHImportedSubmodules ) {
1018
- CB.handleImport (R.getSubmodule (ID));
1019
- }
1020
- Impl.PCHImportedSubmodules .clear ();
1013
+ // We already imported this with -include-pch above, so we should have
1014
+ // collected a bunch of PCH-encoded module imports that we just need to
1015
+ // replay in handleDeferredImports.
1016
+ Impl.handleDeferredImports ();
1021
1017
return false ;
1022
1018
}
1023
1019
clang::FileManager &fileManager = Impl.Instance ->getFileManager ();
@@ -1037,7 +1033,6 @@ bool ClangImporter::importBridgingHeader(StringRef header, ModuleDecl *adapter,
1037
1033
llvm::MemoryBuffer::getMemBufferCopy (
1038
1034
importLine, Implementation::bridgingHeaderBufferName)
1039
1035
};
1040
-
1041
1036
return Impl.importHeader (adapter, header, diagLoc, trackParsedSymbols,
1042
1037
std::move (sourceBuffer), implicitImport);
1043
1038
}
@@ -1234,12 +1229,11 @@ ModuleDecl *ClangImporter::loadModule(
1234
1229
if (!clangModule)
1235
1230
return nullptr ;
1236
1231
1237
- return Impl.finishLoadingClangModule (* this , clangModule,
1232
+ return Impl.finishLoadingClangModule (clangModule,
1238
1233
/* preferAdapter=*/ false );
1239
1234
}
1240
1235
1241
1236
ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule (
1242
- ClangImporter &owner,
1243
1237
const clang::Module *clangModule,
1244
1238
bool findAdapter) {
1245
1239
assert (clangModule);
@@ -1269,7 +1263,7 @@ ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule(
1269
1263
result->setTestingEnabled ();
1270
1264
1271
1265
wrapperUnit =
1272
- new (SwiftContext) ClangModuleUnit (*result, owner , clangModule);
1266
+ new (SwiftContext) ClangModuleUnit (*result, * this , clangModule);
1273
1267
result->addFile (*wrapperUnit);
1274
1268
cacheEntry.setPointerAndInt (wrapperUnit, true );
1275
1269
@@ -1280,7 +1274,7 @@ ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule(
1280
1274
}
1281
1275
1282
1276
if (clangModule->isSubModule ()) {
1283
- finishLoadingClangModule (owner, clangModule->getTopLevelModule (), true );
1277
+ finishLoadingClangModule (clangModule->getTopLevelModule (), true );
1284
1278
} else {
1285
1279
ModuleDecl *&loaded = SwiftContext.LoadedModules [result->getName ()];
1286
1280
if (!loaded)
@@ -1294,6 +1288,25 @@ ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule(
1294
1288
return result;
1295
1289
}
1296
1290
1291
+ // Run through the set of deferred imports -- either those referenced by
1292
+ // submodule ID from a bridging PCH, or those already loaded as clang::Modules
1293
+ // in response to an import directive in a bridging header -- and call
1294
+ // finishLoadingClangModule on each.
1295
+ void ClangImporter::Implementation::handleDeferredImports ()
1296
+ {
1297
+ clang::ASTReader &R = *Instance->getModuleManager ();
1298
+ for (clang::serialization::SubmoduleID ID : PCHImportedSubmodules) {
1299
+ DeferredHeaderImports.push_back (R.getSubmodule (ID));
1300
+ }
1301
+ PCHImportedSubmodules.clear ();
1302
+ for (const clang::Module *M : DeferredHeaderImports) {
1303
+ ModuleDecl *nativeImported =
1304
+ finishLoadingClangModule (M, /* preferAdapter=*/ true );
1305
+ ImportedHeaderExports.push_back ({ /* filter=*/ {}, nativeImported });
1306
+ }
1307
+ DeferredHeaderImports.clear ();
1308
+ }
1309
+
1297
1310
ModuleDecl *ClangImporter::getImportedHeaderModule () const {
1298
1311
return Impl.ImportedHeaderUnit ->getParentModule ();
1299
1312
}
@@ -1381,7 +1394,6 @@ ClangImporter::Implementation::~Implementation() {
1381
1394
}
1382
1395
1383
1396
ClangModuleUnit *ClangImporter::Implementation::getWrapperForModule (
1384
- ClangImporter &importer,
1385
1397
const clang::Module *underlying) {
1386
1398
auto &cacheEntry = ModuleWrappers[underlying];
1387
1399
if (ClangModuleUnit *cached = cacheEntry.getPointer ())
@@ -1393,7 +1405,7 @@ ClangModuleUnit *ClangImporter::Implementation::getWrapperForModule(
1393
1405
// Silence error messages about testably importing a Clang module.
1394
1406
wrapper->setTestingEnabled ();
1395
1407
1396
- auto file = new (SwiftContext) ClangModuleUnit (*wrapper, importer ,
1408
+ auto file = new (SwiftContext) ClangModuleUnit (*wrapper, * this ,
1397
1409
underlying);
1398
1410
wrapper->addFile (*file);
1399
1411
cacheEntry.setPointer (file);
@@ -1414,9 +1426,7 @@ ClangModuleUnit *ClangImporter::Implementation::getClangModuleForDecl(
1414
1426
// ClangModuleUnit.
1415
1427
auto *M = maybeModule.getValue ()->getTopLevelModule ();
1416
1428
1417
- auto &importer =
1418
- static_cast <ClangImporter &>(*SwiftContext.getClangModuleLoader ());
1419
- return getWrapperForModule (importer, M);
1429
+ return getWrapperForModule (M);
1420
1430
}
1421
1431
1422
1432
#pragma mark Source locations
@@ -1988,9 +1998,9 @@ void ClangModuleUnit::lookupVisibleDecls(ModuleDecl::AccessPathTy accessPath,
1988
1998
}
1989
1999
1990
2000
// Find the corresponding lookup table.
1991
- if (auto lookupTable = owner.Impl . findLookupTable (clangModule)) {
2001
+ if (auto lookupTable = owner.findLookupTable (clangModule)) {
1992
2002
// Search it.
1993
- owner.Impl . lookupVisibleDecls (*lookupTable, *actualConsumer);
2003
+ owner.lookupVisibleDecls (*lookupTable, *actualConsumer);
1994
2004
}
1995
2005
}
1996
2006
@@ -2021,14 +2031,14 @@ void ClangModuleUnit::getTopLevelDecls(SmallVectorImpl<Decl*> &results) const {
2021
2031
actualConsumer = &blacklistConsumer;
2022
2032
2023
2033
// Find the corresponding lookup table.
2024
- if (auto lookupTable = owner.Impl . findLookupTable (topLevelModule)) {
2034
+ if (auto lookupTable = owner.findLookupTable (topLevelModule)) {
2025
2035
// Search it.
2026
- owner.Impl . lookupVisibleDecls (*lookupTable, *actualConsumer);
2036
+ owner.lookupVisibleDecls (*lookupTable, *actualConsumer);
2027
2037
2028
2038
// Add the extensions produced by importing categories.
2029
2039
for (auto category : lookupTable->categories ()) {
2030
2040
if (auto extension = cast_or_null<ExtensionDecl>(
2031
- owner.Impl . importDecl (category, owner. Impl .CurrentVersion )))
2041
+ owner.importDecl (category, owner.CurrentVersion )))
2032
2042
results.push_back (extension);
2033
2043
}
2034
2044
@@ -2040,7 +2050,7 @@ void ClangModuleUnit::getTopLevelDecls(SmallVectorImpl<Decl*> &results) const {
2040
2050
for (auto entry : lookupTable->allGlobalsAsMembers ()) {
2041
2051
auto decl = entry.get <clang::NamedDecl *>();
2042
2052
auto importedDecl =
2043
- owner.Impl . importDecl (decl, owner. Impl .CurrentVersion );
2053
+ owner.importDecl (decl, owner.CurrentVersion );
2044
2054
if (!importedDecl) continue ;
2045
2055
2046
2056
auto ext = dyn_cast<ExtensionDecl>(importedDecl->getDeclContext ());
@@ -2125,9 +2135,9 @@ void ClangModuleUnit::lookupValue(ModuleDecl::AccessPathTy accessPath,
2125
2135
}
2126
2136
2127
2137
// Find the corresponding lookup table.
2128
- if (auto lookupTable = owner.Impl . findLookupTable (clangModule)) {
2138
+ if (auto lookupTable = owner.findLookupTable (clangModule)) {
2129
2139
// Search it.
2130
- owner.Impl . lookupValue (*lookupTable, name, *consumer);
2140
+ owner.lookupValue (*lookupTable, name, *consumer);
2131
2141
}
2132
2142
}
2133
2143
@@ -2265,9 +2275,9 @@ ClangModuleUnit::lookupClassMember(ModuleDecl::AccessPathTy accessPath,
2265
2275
VectorDeclConsumer consumer (results);
2266
2276
2267
2277
// Find the corresponding lookup table.
2268
- if (auto lookupTable = owner.Impl . findLookupTable (clangModule)) {
2278
+ if (auto lookupTable = owner.findLookupTable (clangModule)) {
2269
2279
// Search it.
2270
- owner.Impl . lookupObjCMembers (*lookupTable, name, consumer);
2280
+ owner.lookupObjCMembers (*lookupTable, name, consumer);
2271
2281
}
2272
2282
}
2273
2283
@@ -2278,9 +2288,9 @@ void ClangModuleUnit::lookupClassMembers(ModuleDecl::AccessPathTy accessPath,
2278
2288
return ;
2279
2289
2280
2290
// Find the corresponding lookup table.
2281
- if (auto lookupTable = owner.Impl . findLookupTable (clangModule)) {
2291
+ if (auto lookupTable = owner.findLookupTable (clangModule)) {
2282
2292
// Search it.
2283
- owner.Impl . lookupAllObjCMembers (*lookupTable, consumer);
2293
+ owner.lookupAllObjCMembers (*lookupTable, consumer);
2284
2294
}
2285
2295
}
2286
2296
@@ -2292,12 +2302,12 @@ void ClangModuleUnit::lookupObjCMethods(
2292
2302
return ;
2293
2303
2294
2304
// Map the selector into a Clang selector.
2295
- auto clangSelector = owner.Impl . exportSelector (selector);
2305
+ auto clangSelector = owner.exportSelector (selector);
2296
2306
if (clangSelector.isNull ()) return ;
2297
2307
2298
2308
// Collect all of the Objective-C methods with this selector.
2299
2309
SmallVector<clang::ObjCMethodDecl *, 8 > objcMethods;
2300
- auto &clangSema = owner.Impl . getClangSema ();
2310
+ auto &clangSema = owner.getClangSema ();
2301
2311
clangSema.CollectMultipleMethodsInGlobalPool (clangSelector,
2302
2312
objcMethods,
2303
2313
/* InstanceFirst=*/ true ,
@@ -2319,23 +2329,23 @@ void ClangModuleUnit::lookupObjCMethods(
2319
2329
2320
2330
// If we found a property accessor, import the property.
2321
2331
if (objcMethod->isPropertyAccessor ())
2322
- (void )owner.Impl . importDecl (objcMethod->findPropertyDecl (true ),
2323
- owner. Impl .CurrentVersion );
2332
+ (void )owner.importDecl (objcMethod->findPropertyDecl (true ),
2333
+ owner.CurrentVersion );
2324
2334
2325
2335
// Import it.
2326
2336
// FIXME: Retrying a failed import works around recursion bugs in the Clang
2327
2337
// importer.
2328
2338
auto imported =
2329
- owner.Impl . importDecl (objcMethod, owner. Impl .CurrentVersion );
2339
+ owner.importDecl (objcMethod, owner.CurrentVersion );
2330
2340
if (!imported)
2331
- imported = owner.Impl . importDecl (objcMethod, owner. Impl .CurrentVersion );
2341
+ imported = owner.importDecl (objcMethod, owner.CurrentVersion );
2332
2342
if (!imported) continue ;
2333
2343
2334
2344
if (auto func = dyn_cast<AbstractFunctionDecl>(imported))
2335
2345
results.push_back (func);
2336
2346
2337
2347
// If there is an alternate declaration, also look at it.
2338
- for (auto alternate : owner.Impl . getAlternateDecls (imported)) {
2348
+ for (auto alternate : owner.getAlternateDecls (imported)) {
2339
2349
if (auto func = dyn_cast<AbstractFunctionDecl>(alternate))
2340
2350
results.push_back (func);
2341
2351
}
@@ -2435,7 +2445,8 @@ void ClangImporter::verifyAllModules() {
2435
2445
// ClangModule Implementation
2436
2446
// ===----------------------------------------------------------------------===//
2437
2447
2438
- ClangModuleUnit::ClangModuleUnit (ModuleDecl &M, ClangImporter &owner,
2448
+ ClangModuleUnit::ClangModuleUnit (ModuleDecl &M,
2449
+ ClangImporter::Implementation &owner,
2439
2450
const clang::Module *clangModule)
2440
2451
: LoadedFile(FileUnitKind::ClangModule, M), owner(owner),
2441
2452
clangModule(clangModule) {
@@ -2468,7 +2479,7 @@ ModuleDecl *ClangModuleUnit::getAdapterModule() const {
2468
2479
if (!isTopLevel ()) {
2469
2480
// FIXME: Is this correct for submodules?
2470
2481
auto topLevel = clangModule->getTopLevelModule ();
2471
- auto wrapper = owner.Impl . getWrapperForModule (owner, topLevel);
2482
+ auto wrapper = owner.getWrapperForModule (topLevel);
2472
2483
return wrapper->getAdapterModule ();
2473
2484
}
2474
2485
@@ -2504,8 +2515,8 @@ void ClangModuleUnit::getImportedModules(
2504
2515
if (!clangModule) {
2505
2516
// This is the special "imported headers" module.
2506
2517
if (filter != ModuleDecl::ImportFilter::Private) {
2507
- imports.append (owner.Impl . ImportedHeaderExports .begin (),
2508
- owner.Impl . ImportedHeaderExports .end ());
2518
+ imports.append (owner.ImportedHeaderExports .begin (),
2519
+ owner.ImportedHeaderExports .end ());
2509
2520
}
2510
2521
return ;
2511
2522
}
@@ -2541,7 +2552,7 @@ void ClangModuleUnit::getImportedModules(
2541
2552
}
2542
2553
2543
2554
for (auto importMod : imported) {
2544
- auto wrapper = owner.Impl . getWrapperForModule (owner, importMod);
2555
+ auto wrapper = owner.getWrapperForModule (importMod);
2545
2556
2546
2557
auto actualMod = wrapper->getAdapterModule ();
2547
2558
if (!actualMod) {
@@ -2550,8 +2561,7 @@ void ClangModuleUnit::getImportedModules(
2550
2561
auto importTopLevel = importMod->getTopLevelModule ();
2551
2562
if (importTopLevel != importMod &&
2552
2563
importTopLevel != clangModule->getTopLevelModule ()) {
2553
- auto topLevelWrapper = owner.Impl .getWrapperForModule (owner,
2554
- importTopLevel);
2564
+ auto topLevelWrapper = owner.getWrapperForModule (importTopLevel);
2555
2565
imports.push_back ({ ModuleDecl::AccessPathTy (),
2556
2566
topLevelWrapper->getParentModule () });
2557
2567
}
@@ -2570,8 +2580,8 @@ void ClangModuleUnit::getImportedModulesForLookup(
2570
2580
2571
2581
if (!clangModule) {
2572
2582
// This is the special "imported headers" module.
2573
- imports.append (owner.Impl . ImportedHeaderExports .begin (),
2574
- owner.Impl . ImportedHeaderExports .end ());
2583
+ imports.append (owner.ImportedHeaderExports .begin (),
2584
+ owner.ImportedHeaderExports .end ());
2575
2585
return ;
2576
2586
}
2577
2587
@@ -2608,7 +2618,7 @@ void ClangModuleUnit::getImportedModulesForLookup(
2608
2618
2609
2619
// Don't continue looking through submodules of modules that have
2610
2620
// overlays. The overlay might shadow things.
2611
- auto wrapper = owner.Impl . getWrapperForModule (owner, nextTopLevel);
2621
+ auto wrapper = owner.getWrapperForModule (nextTopLevel);
2612
2622
if (wrapper->getAdapterModule ())
2613
2623
continue ;
2614
2624
}
@@ -2626,7 +2636,7 @@ void ClangModuleUnit::getImportedModulesForLookup(
2626
2636
}
2627
2637
2628
2638
for (auto importMod : topLevelImported) {
2629
- auto wrapper = owner.Impl . getWrapperForModule (owner, importMod);
2639
+ auto wrapper = owner.getWrapperForModule (importMod);
2630
2640
2631
2641
auto actualMod = wrapper->getAdapterModule ();
2632
2642
if (!actualMod || actualMod == topLevelAdapter)
0 commit comments