Skip to content

Commit 49231a3

Browse files
committed
[Clang Importer] Make ClangModuleUnit owned by ClangImporter::Implementation.
1 parent 0db5cf6 commit 49231a3

File tree

4 files changed

+44
-52
lines changed

4 files changed

+44
-52
lines changed

include/swift/ClangImporter/ClangModule.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#define SWIFT_CLANGIMPORTER_CLANGMODULE_H
1818

1919
#include "swift/AST/Module.h"
20+
#include "swift/ClangImporter/ClangImporter.h"
2021

2122
namespace clang {
2223
class ASTContext;
@@ -26,12 +27,11 @@ namespace clang {
2627
namespace swift {
2728

2829
class ASTContext;
29-
class ClangImporter;
3030
class ModuleLoader;
3131

3232
/// \brief Represents a Clang module that has been imported into Swift.
3333
class ClangModuleUnit final : public LoadedFile {
34-
ClangImporter &owner;
34+
ClangImporter::Implementation &owner;
3535
const clang::Module *clangModule;
3636
llvm::PointerIntPair<ModuleDecl *, 1, bool> adapterModule;
3737
mutable ArrayRef<ModuleDecl::ImportedModule> importedModulesForLookup;
@@ -42,7 +42,7 @@ class ClangModuleUnit final : public LoadedFile {
4242
/// True if the given Module contains an imported Clang module unit.
4343
static bool hasClangModule(ModuleDecl *M);
4444

45-
ClangModuleUnit(ModuleDecl &M, ClangImporter &owner,
45+
ClangModuleUnit(ModuleDecl &M, ClangImporter::Implementation &owner,
4646
const clang::Module *clangModule);
4747

4848
/// \brief Retrieve the underlying Clang module.

lib/ClangImporter/ClangImporter.cpp

Lines changed: 37 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ namespace {
8383
void handleImport(const clang::Module *imported) {
8484
if (!imported)
8585
return;
86-
ModuleDecl *nativeImported = Impl.finishLoadingClangModule(Importer, imported,
86+
ModuleDecl *nativeImported = Impl.finishLoadingClangModule(imported,
8787
/*preferAdapter=*/true);
8888
Impl.ImportedHeaderExports.push_back({ /*filter=*/{}, nativeImported });
8989
}
@@ -835,7 +835,7 @@ ClangImporter::create(ASTContext &ctx,
835835
// Set up the imported header module.
836836
auto *importedHeaderModule = ModuleDecl::create(ctx.getIdentifier("__ObjC"), ctx);
837837
importer->Impl.ImportedHeaderUnit =
838-
new (ctx) ClangModuleUnit(*importedHeaderModule, *importer, nullptr);
838+
new (ctx) ClangModuleUnit(*importedHeaderModule, importer->Impl, nullptr);
839839
importedHeaderModule->addFile(*importer->Impl.ImportedHeaderUnit);
840840

841841
importer->Impl.IsReadingBridgingPCH = false;
@@ -1234,12 +1234,11 @@ ModuleDecl *ClangImporter::loadModule(
12341234
if (!clangModule)
12351235
return nullptr;
12361236

1237-
return Impl.finishLoadingClangModule(*this, clangModule,
1237+
return Impl.finishLoadingClangModule(clangModule,
12381238
/*preferAdapter=*/false);
12391239
}
12401240

12411241
ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule(
1242-
ClangImporter &owner,
12431242
const clang::Module *clangModule,
12441243
bool findAdapter) {
12451244
assert(clangModule);
@@ -1269,7 +1268,7 @@ ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule(
12691268
result->setTestingEnabled();
12701269

12711270
wrapperUnit =
1272-
new (SwiftContext) ClangModuleUnit(*result, owner, clangModule);
1271+
new (SwiftContext) ClangModuleUnit(*result, *this, clangModule);
12731272
result->addFile(*wrapperUnit);
12741273
cacheEntry.setPointerAndInt(wrapperUnit, true);
12751274

@@ -1280,7 +1279,7 @@ ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule(
12801279
}
12811280

12821281
if (clangModule->isSubModule()) {
1283-
finishLoadingClangModule(owner, clangModule->getTopLevelModule(), true);
1282+
finishLoadingClangModule(clangModule->getTopLevelModule(), true);
12841283
} else {
12851284
ModuleDecl *&loaded = SwiftContext.LoadedModules[result->getName()];
12861285
if (!loaded)
@@ -1381,7 +1380,6 @@ ClangImporter::Implementation::~Implementation() {
13811380
}
13821381

13831382
ClangModuleUnit *ClangImporter::Implementation::getWrapperForModule(
1384-
ClangImporter &importer,
13851383
const clang::Module *underlying) {
13861384
auto &cacheEntry = ModuleWrappers[underlying];
13871385
if (ClangModuleUnit *cached = cacheEntry.getPointer())
@@ -1393,7 +1391,7 @@ ClangModuleUnit *ClangImporter::Implementation::getWrapperForModule(
13931391
// Silence error messages about testably importing a Clang module.
13941392
wrapper->setTestingEnabled();
13951393

1396-
auto file = new (SwiftContext) ClangModuleUnit(*wrapper, importer,
1394+
auto file = new (SwiftContext) ClangModuleUnit(*wrapper, *this,
13971395
underlying);
13981396
wrapper->addFile(*file);
13991397
cacheEntry.setPointer(file);
@@ -1414,9 +1412,7 @@ ClangModuleUnit *ClangImporter::Implementation::getClangModuleForDecl(
14141412
// ClangModuleUnit.
14151413
auto *M = maybeModule.getValue()->getTopLevelModule();
14161414

1417-
auto &importer =
1418-
static_cast<ClangImporter &>(*SwiftContext.getClangModuleLoader());
1419-
return getWrapperForModule(importer, M);
1415+
return getWrapperForModule(M);
14201416
}
14211417

14221418
#pragma mark Source locations
@@ -1988,9 +1984,9 @@ void ClangModuleUnit::lookupVisibleDecls(ModuleDecl::AccessPathTy accessPath,
19881984
}
19891985

19901986
// Find the corresponding lookup table.
1991-
if (auto lookupTable = owner.Impl.findLookupTable(clangModule)) {
1987+
if (auto lookupTable = owner.findLookupTable(clangModule)) {
19921988
// Search it.
1993-
owner.Impl.lookupVisibleDecls(*lookupTable, *actualConsumer);
1989+
owner.lookupVisibleDecls(*lookupTable, *actualConsumer);
19941990
}
19951991
}
19961992

@@ -2021,14 +2017,14 @@ void ClangModuleUnit::getTopLevelDecls(SmallVectorImpl<Decl*> &results) const {
20212017
actualConsumer = &blacklistConsumer;
20222018

20232019
// Find the corresponding lookup table.
2024-
if (auto lookupTable = owner.Impl.findLookupTable(topLevelModule)) {
2020+
if (auto lookupTable = owner.findLookupTable(topLevelModule)) {
20252021
// Search it.
2026-
owner.Impl.lookupVisibleDecls(*lookupTable, *actualConsumer);
2022+
owner.lookupVisibleDecls(*lookupTable, *actualConsumer);
20272023

20282024
// Add the extensions produced by importing categories.
20292025
for (auto category : lookupTable->categories()) {
20302026
if (auto extension = cast_or_null<ExtensionDecl>(
2031-
owner.Impl.importDecl(category, owner.Impl.CurrentVersion)))
2027+
owner.importDecl(category, owner.CurrentVersion)))
20322028
results.push_back(extension);
20332029
}
20342030

@@ -2040,7 +2036,7 @@ void ClangModuleUnit::getTopLevelDecls(SmallVectorImpl<Decl*> &results) const {
20402036
for (auto entry : lookupTable->allGlobalsAsMembers()) {
20412037
auto decl = entry.get<clang::NamedDecl *>();
20422038
auto importedDecl =
2043-
owner.Impl.importDecl(decl, owner.Impl.CurrentVersion);
2039+
owner.importDecl(decl, owner.CurrentVersion);
20442040
if (!importedDecl) continue;
20452041

20462042
auto ext = dyn_cast<ExtensionDecl>(importedDecl->getDeclContext());
@@ -2125,9 +2121,9 @@ void ClangModuleUnit::lookupValue(ModuleDecl::AccessPathTy accessPath,
21252121
}
21262122

21272123
// Find the corresponding lookup table.
2128-
if (auto lookupTable = owner.Impl.findLookupTable(clangModule)) {
2124+
if (auto lookupTable = owner.findLookupTable(clangModule)) {
21292125
// Search it.
2130-
owner.Impl.lookupValue(*lookupTable, name, *consumer);
2126+
owner.lookupValue(*lookupTable, name, *consumer);
21312127
}
21322128
}
21332129

@@ -2265,9 +2261,9 @@ ClangModuleUnit::lookupClassMember(ModuleDecl::AccessPathTy accessPath,
22652261
VectorDeclConsumer consumer(results);
22662262

22672263
// Find the corresponding lookup table.
2268-
if (auto lookupTable = owner.Impl.findLookupTable(clangModule)) {
2264+
if (auto lookupTable = owner.findLookupTable(clangModule)) {
22692265
// Search it.
2270-
owner.Impl.lookupObjCMembers(*lookupTable, name, consumer);
2266+
owner.lookupObjCMembers(*lookupTable, name, consumer);
22712267
}
22722268
}
22732269

@@ -2278,9 +2274,9 @@ void ClangModuleUnit::lookupClassMembers(ModuleDecl::AccessPathTy accessPath,
22782274
return;
22792275

22802276
// Find the corresponding lookup table.
2281-
if (auto lookupTable = owner.Impl.findLookupTable(clangModule)) {
2277+
if (auto lookupTable = owner.findLookupTable(clangModule)) {
22822278
// Search it.
2283-
owner.Impl.lookupAllObjCMembers(*lookupTable, consumer);
2279+
owner.lookupAllObjCMembers(*lookupTable, consumer);
22842280
}
22852281
}
22862282

@@ -2292,12 +2288,12 @@ void ClangModuleUnit::lookupObjCMethods(
22922288
return;
22932289

22942290
// Map the selector into a Clang selector.
2295-
auto clangSelector = owner.Impl.exportSelector(selector);
2291+
auto clangSelector = owner.exportSelector(selector);
22962292
if (clangSelector.isNull()) return;
22972293

22982294
// Collect all of the Objective-C methods with this selector.
22992295
SmallVector<clang::ObjCMethodDecl *, 8> objcMethods;
2300-
auto &clangSema = owner.Impl.getClangSema();
2296+
auto &clangSema = owner.getClangSema();
23012297
clangSema.CollectMultipleMethodsInGlobalPool(clangSelector,
23022298
objcMethods,
23032299
/*InstanceFirst=*/true,
@@ -2319,23 +2315,23 @@ void ClangModuleUnit::lookupObjCMethods(
23192315

23202316
// If we found a property accessor, import the property.
23212317
if (objcMethod->isPropertyAccessor())
2322-
(void)owner.Impl.importDecl(objcMethod->findPropertyDecl(true),
2323-
owner.Impl.CurrentVersion);
2318+
(void)owner.importDecl(objcMethod->findPropertyDecl(true),
2319+
owner.CurrentVersion);
23242320

23252321
// Import it.
23262322
// FIXME: Retrying a failed import works around recursion bugs in the Clang
23272323
// importer.
23282324
auto imported =
2329-
owner.Impl.importDecl(objcMethod, owner.Impl.CurrentVersion);
2325+
owner.importDecl(objcMethod, owner.CurrentVersion);
23302326
if (!imported)
2331-
imported = owner.Impl.importDecl(objcMethod, owner.Impl.CurrentVersion);
2327+
imported = owner.importDecl(objcMethod, owner.CurrentVersion);
23322328
if (!imported) continue;
23332329

23342330
if (auto func = dyn_cast<AbstractFunctionDecl>(imported))
23352331
results.push_back(func);
23362332

23372333
// If there is an alternate declaration, also look at it.
2338-
for (auto alternate : owner.Impl.getAlternateDecls(imported)) {
2334+
for (auto alternate : owner.getAlternateDecls(imported)) {
23392335
if (auto func = dyn_cast<AbstractFunctionDecl>(alternate))
23402336
results.push_back(func);
23412337
}
@@ -2435,7 +2431,8 @@ void ClangImporter::verifyAllModules() {
24352431
// ClangModule Implementation
24362432
//===----------------------------------------------------------------------===//
24372433

2438-
ClangModuleUnit::ClangModuleUnit(ModuleDecl &M, ClangImporter &owner,
2434+
ClangModuleUnit::ClangModuleUnit(ModuleDecl &M,
2435+
ClangImporter::Implementation &owner,
24392436
const clang::Module *clangModule)
24402437
: LoadedFile(FileUnitKind::ClangModule, M), owner(owner),
24412438
clangModule(clangModule) {
@@ -2468,7 +2465,7 @@ ModuleDecl *ClangModuleUnit::getAdapterModule() const {
24682465
if (!isTopLevel()) {
24692466
// FIXME: Is this correct for submodules?
24702467
auto topLevel = clangModule->getTopLevelModule();
2471-
auto wrapper = owner.Impl.getWrapperForModule(owner, topLevel);
2468+
auto wrapper = owner.getWrapperForModule(topLevel);
24722469
return wrapper->getAdapterModule();
24732470
}
24742471

@@ -2504,8 +2501,8 @@ void ClangModuleUnit::getImportedModules(
25042501
if (!clangModule) {
25052502
// This is the special "imported headers" module.
25062503
if (filter != ModuleDecl::ImportFilter::Private) {
2507-
imports.append(owner.Impl.ImportedHeaderExports.begin(),
2508-
owner.Impl.ImportedHeaderExports.end());
2504+
imports.append(owner.ImportedHeaderExports.begin(),
2505+
owner.ImportedHeaderExports.end());
25092506
}
25102507
return;
25112508
}
@@ -2541,7 +2538,7 @@ void ClangModuleUnit::getImportedModules(
25412538
}
25422539

25432540
for (auto importMod : imported) {
2544-
auto wrapper = owner.Impl.getWrapperForModule(owner, importMod);
2541+
auto wrapper = owner.getWrapperForModule(importMod);
25452542

25462543
auto actualMod = wrapper->getAdapterModule();
25472544
if (!actualMod) {
@@ -2550,8 +2547,7 @@ void ClangModuleUnit::getImportedModules(
25502547
auto importTopLevel = importMod->getTopLevelModule();
25512548
if (importTopLevel != importMod &&
25522549
importTopLevel != clangModule->getTopLevelModule()) {
2553-
auto topLevelWrapper = owner.Impl.getWrapperForModule(owner,
2554-
importTopLevel);
2550+
auto topLevelWrapper = owner.getWrapperForModule(importTopLevel);
25552551
imports.push_back({ ModuleDecl::AccessPathTy(),
25562552
topLevelWrapper->getParentModule() });
25572553
}
@@ -2570,8 +2566,8 @@ void ClangModuleUnit::getImportedModulesForLookup(
25702566

25712567
if (!clangModule) {
25722568
// This is the special "imported headers" module.
2573-
imports.append(owner.Impl.ImportedHeaderExports.begin(),
2574-
owner.Impl.ImportedHeaderExports.end());
2569+
imports.append(owner.ImportedHeaderExports.begin(),
2570+
owner.ImportedHeaderExports.end());
25752571
return;
25762572
}
25772573

@@ -2608,7 +2604,7 @@ void ClangModuleUnit::getImportedModulesForLookup(
26082604

26092605
// Don't continue looking through submodules of modules that have
26102606
// overlays. The overlay might shadow things.
2611-
auto wrapper = owner.Impl.getWrapperForModule(owner, nextTopLevel);
2607+
auto wrapper = owner.getWrapperForModule(nextTopLevel);
26122608
if (wrapper->getAdapterModule())
26132609
continue;
26142610
}
@@ -2626,7 +2622,7 @@ void ClangModuleUnit::getImportedModulesForLookup(
26262622
}
26272623

26282624
for (auto importMod : topLevelImported) {
2629-
auto wrapper = owner.Impl.getWrapperForModule(owner, importMod);
2625+
auto wrapper = owner.getWrapperForModule(importMod);
26302626

26312627
auto actualMod = wrapper->getAdapterModule();
26322628
if (!actualMod || actualMod == topLevelAdapter)

lib/ClangImporter/ImportMacro.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ ClangModuleUnit *ClangImporter::Implementation::getClangModuleForMacro(
5151
// ClangModule.
5252
auto *M = maybeModule.getValue()->getTopLevelModule();
5353

54-
auto &importer =
55-
static_cast<ClangImporter &>(*SwiftContext.getClangModuleLoader());
56-
return getWrapperForModule(importer, M);
54+
return getWrapperForModule(M);
5755
}
5856

5957
template <typename T = clang::Expr>

lib/ClangImporter/ImporterImpl.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -815,13 +815,11 @@ class LLVM_LIBRARY_VISIBILITY ClangImporter::Implementation
815815

816816
/// \brief Retrieves the Swift wrapper for the given Clang module, creating
817817
/// it if necessary.
818-
ClangModuleUnit *getWrapperForModule(ClangImporter &importer,
819-
const clang::Module *underlying);
818+
ClangModuleUnit *getWrapperForModule(const clang::Module *underlying);
820819

821820
/// \brief Constructs a Swift module for the given Clang module.
822-
ModuleDecl *finishLoadingClangModule(ClangImporter &importer,
823-
const clang::Module *clangModule,
824-
bool preferAdapter);
821+
ModuleDecl *finishLoadingClangModule(const clang::Module *clangModule,
822+
bool preferAdapter);
825823

826824
/// \brief Retrieve the named Swift type, e.g., Int32.
827825
///

0 commit comments

Comments
 (0)