@@ -83,7 +83,8 @@ namespace {
83
83
void handleImport (const clang::Module *imported) {
84
84
if (!imported)
85
85
return ;
86
- Impl.DeferredHeaderImports .push_back (imported);
86
+ Impl.ImportedHeaderExports .push_back (
87
+ const_cast <clang::Module *>(imported));
87
88
}
88
89
89
90
void InclusionDirective (clang::SourceLocation HashLoc,
@@ -1596,16 +1597,15 @@ ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule(
1596
1597
void ClangImporter::Implementation::handleDeferredImports ()
1597
1598
{
1598
1599
clang::ASTReader &R = *Instance->getModuleManager ();
1600
+ llvm::SmallSet<clang::serialization::SubmoduleID, 32 > seenSubmodules;
1599
1601
for (clang::serialization::SubmoduleID ID : PCHImportedSubmodules) {
1600
- DeferredHeaderImports.push_back (R.getSubmodule (ID));
1602
+ if (!seenSubmodules.insert (ID).second )
1603
+ continue ;
1604
+ ImportedHeaderExports.push_back (R.getSubmodule (ID));
1601
1605
}
1602
1606
PCHImportedSubmodules.clear ();
1603
- for (const clang::Module *M : DeferredHeaderImports) {
1604
- ModuleDecl *nativeImported =
1605
- finishLoadingClangModule (M, /* preferAdapter=*/ true );
1606
- ImportedHeaderExports.push_back ({ /* filter=*/ {}, nativeImported });
1607
- }
1608
- DeferredHeaderImports.clear ();
1607
+ for (const clang::Module *M : ImportedHeaderExports)
1608
+ (void )finishLoadingClangModule (M, /* preferAdapter=*/ true );
1609
1609
}
1610
1610
1611
1611
ModuleDecl *ClangImporter::getImportedHeaderModule () const {
@@ -2948,45 +2948,44 @@ void ClangModuleUnit::getImportedModules(
2948
2948
if (filter != ModuleDecl::ImportFilter::Public)
2949
2949
imports.push_back ({ModuleDecl::AccessPathTy (), owner.getStdlibModule ()});
2950
2950
2951
+ SmallVector<clang::Module *, 8 > imported;
2951
2952
if (!clangModule) {
2952
2953
// This is the special "imported headers" module.
2953
2954
if (filter != ModuleDecl::ImportFilter::Private) {
2954
- imports .append (owner.ImportedHeaderExports .begin (),
2955
- owner.ImportedHeaderExports .end ());
2955
+ imported .append (owner.ImportedHeaderExports .begin (),
2956
+ owner.ImportedHeaderExports .end ());
2956
2957
}
2957
- return ;
2958
- }
2959
2958
2960
- auto topLevelAdapter = getAdapterModule ();
2959
+ } else {
2960
+ clangModule->getExportedModules (imported);
2961
+ if (filter != ModuleDecl::ImportFilter::Public) {
2962
+ if (filter == ModuleDecl::ImportFilter::All) {
2963
+ llvm::SmallPtrSet<clang::Module *, 8 > knownModules;
2964
+ imported.append (clangModule->Imports .begin (), clangModule->Imports .end ());
2965
+ imported.erase (std::remove_if (imported.begin (), imported.end (),
2966
+ [&](clang::Module *mod) -> bool {
2967
+ return !knownModules.insert (mod).second ;
2968
+ }),
2969
+ imported.end ());
2970
+ } else {
2971
+ llvm::SmallPtrSet<clang::Module *, 8 > knownModules (imported.begin (),
2972
+ imported.end ());
2973
+ SmallVector<clang::Module *, 8 > privateImports;
2974
+ std::copy_if (clangModule->Imports .begin (), clangModule->Imports .end (),
2975
+ std::back_inserter (privateImports), [&](clang::Module *mod) {
2976
+ return knownModules.count (mod) == 0 ;
2977
+ });
2978
+ imported.swap (privateImports);
2979
+ }
2961
2980
2962
- SmallVector<clang::Module *, 8 > imported;
2963
- clangModule->getExportedModules (imported);
2964
- if (filter != ModuleDecl::ImportFilter::Public) {
2965
- if (filter == ModuleDecl::ImportFilter::All) {
2966
- llvm::SmallPtrSet<clang::Module *, 8 > knownModules;
2967
- imported.append (clangModule->Imports .begin (), clangModule->Imports .end ());
2968
- imported.erase (std::remove_if (imported.begin (), imported.end (),
2969
- [&](clang::Module *mod) -> bool {
2970
- return !knownModules.insert (mod).second ;
2971
- }),
2972
- imported.end ());
2973
- } else {
2974
- llvm::SmallPtrSet<clang::Module *, 8 > knownModules (imported.begin (),
2975
- imported.end ());
2976
- SmallVector<clang::Module *, 8 > privateImports;
2977
- std::copy_if (clangModule->Imports .begin (), clangModule->Imports .end (),
2978
- std::back_inserter (privateImports), [&](clang::Module *mod) {
2979
- return knownModules.count (mod) == 0 ;
2980
- });
2981
- imported.swap (privateImports);
2981
+ // FIXME: The parent module isn't exactly a private import, but it is
2982
+ // needed for link dependencies.
2983
+ if (clangModule->Parent )
2984
+ imported.push_back (clangModule->Parent );
2982
2985
}
2983
-
2984
- // FIXME: The parent module isn't exactly a private import, but it is
2985
- // needed for link dependencies.
2986
- if (clangModule->Parent )
2987
- imported.push_back (clangModule->Parent );
2988
2986
}
2989
2987
2988
+ auto topLevelAdapter = getAdapterModule ();
2990
2989
for (auto importMod : imported) {
2991
2990
auto wrapper = owner.getWrapperForModule (importMod);
2992
2991
@@ -2995,11 +2994,12 @@ void ClangModuleUnit::getImportedModules(
2995
2994
// HACK: Deal with imports of submodules by importing the top-level module
2996
2995
// as well.
2997
2996
auto importTopLevel = importMod->getTopLevelModule ();
2998
- if (importTopLevel != importMod &&
2999
- importTopLevel != clangModule->getTopLevelModule ()) {
3000
- auto topLevelWrapper = owner.getWrapperForModule (importTopLevel);
3001
- imports.push_back ({ ModuleDecl::AccessPathTy (),
3002
- topLevelWrapper->getParentModule () });
2997
+ if (importTopLevel != importMod) {
2998
+ if (!clangModule || importTopLevel != clangModule->getTopLevelModule ()){
2999
+ auto topLevelWrapper = owner.getWrapperForModule (importTopLevel);
3000
+ imports.push_back ({ ModuleDecl::AccessPathTy (),
3001
+ topLevelWrapper->getParentModule () });
3002
+ }
3003
3003
}
3004
3004
actualMod = wrapper->getParentModule ();
3005
3005
} else if (actualMod == topLevelAdapter) {
@@ -3014,13 +3014,6 @@ void ClangModuleUnit::getImportedModules(
3014
3014
void ClangModuleUnit::getImportedModulesForLookup (
3015
3015
SmallVectorImpl<ModuleDecl::ImportedModule> &imports) const {
3016
3016
3017
- if (!clangModule) {
3018
- // This is the special "imported headers" module.
3019
- imports.append (owner.ImportedHeaderExports .begin (),
3020
- owner.ImportedHeaderExports .end ());
3021
- return ;
3022
- }
3023
-
3024
3017
// Reuse our cached list of imports if we have one.
3025
3018
if (!importedModulesForLookup.empty ()) {
3026
3019
imports.append (importedModulesForLookup.begin (),
@@ -3029,11 +3022,20 @@ void ClangModuleUnit::getImportedModulesForLookup(
3029
3022
}
3030
3023
3031
3024
size_t firstImport = imports.size ();
3032
- auto topLevel = clangModule->getTopLevelModule ();
3033
- auto topLevelAdapter = getAdapterModule ();
3034
3025
3035
3026
SmallVector<clang::Module *, 8 > imported;
3036
- clangModule->getExportedModules (imported);
3027
+ const clang::Module *topLevel;
3028
+ ModuleDecl *topLevelAdapter = getAdapterModule ();
3029
+ if (!clangModule) {
3030
+ // This is the special "imported headers" module.
3031
+ imported.append (owner.ImportedHeaderExports .begin (),
3032
+ owner.ImportedHeaderExports .end ());
3033
+ topLevel = nullptr ;
3034
+ } else {
3035
+ clangModule->getExportedModules (imported);
3036
+ topLevel = clangModule->getTopLevelModule ();
3037
+ }
3038
+
3037
3039
if (imported.empty ())
3038
3040
return ;
3039
3041
0 commit comments