@@ -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,
@@ -1584,16 +1585,15 @@ ModuleDecl *ClangImporter::Implementation::finishLoadingClangModule(
1584
1585
void ClangImporter::Implementation::handleDeferredImports ()
1585
1586
{
1586
1587
clang::ASTReader &R = *Instance->getModuleManager ();
1588
+ llvm::SmallSet<clang::serialization::SubmoduleID, 32 > seenSubmodules;
1587
1589
for (clang::serialization::SubmoduleID ID : PCHImportedSubmodules) {
1588
- DeferredHeaderImports.push_back (R.getSubmodule (ID));
1590
+ if (!seenSubmodules.insert (ID).second )
1591
+ continue ;
1592
+ ImportedHeaderExports.push_back (R.getSubmodule (ID));
1589
1593
}
1590
1594
PCHImportedSubmodules.clear ();
1591
- for (const clang::Module *M : DeferredHeaderImports) {
1592
- ModuleDecl *nativeImported =
1593
- finishLoadingClangModule (M, /* preferAdapter=*/ true );
1594
- ImportedHeaderExports.push_back ({ /* filter=*/ {}, nativeImported });
1595
- }
1596
- DeferredHeaderImports.clear ();
1595
+ for (const clang::Module *M : ImportedHeaderExports)
1596
+ (void )finishLoadingClangModule (M, /* preferAdapter=*/ true );
1597
1597
}
1598
1598
1599
1599
ModuleDecl *ClangImporter::getImportedHeaderModule () const {
@@ -2936,45 +2936,44 @@ void ClangModuleUnit::getImportedModules(
2936
2936
if (filter != ModuleDecl::ImportFilter::Public)
2937
2937
imports.push_back ({ModuleDecl::AccessPathTy (), owner.getStdlibModule ()});
2938
2938
2939
+ SmallVector<clang::Module *, 8 > imported;
2939
2940
if (!clangModule) {
2940
2941
// This is the special "imported headers" module.
2941
2942
if (filter != ModuleDecl::ImportFilter::Private) {
2942
- imports .append (owner.ImportedHeaderExports .begin (),
2943
- owner.ImportedHeaderExports .end ());
2943
+ imported .append (owner.ImportedHeaderExports .begin (),
2944
+ owner.ImportedHeaderExports .end ());
2944
2945
}
2945
- return ;
2946
- }
2947
2946
2948
- auto topLevelAdapter = getAdapterModule ();
2947
+ } else {
2948
+ clangModule->getExportedModules (imported);
2949
+ if (filter != ModuleDecl::ImportFilter::Public) {
2950
+ if (filter == ModuleDecl::ImportFilter::All) {
2951
+ llvm::SmallPtrSet<clang::Module *, 8 > knownModules;
2952
+ imported.append (clangModule->Imports .begin (), clangModule->Imports .end ());
2953
+ imported.erase (std::remove_if (imported.begin (), imported.end (),
2954
+ [&](clang::Module *mod) -> bool {
2955
+ return !knownModules.insert (mod).second ;
2956
+ }),
2957
+ imported.end ());
2958
+ } else {
2959
+ llvm::SmallPtrSet<clang::Module *, 8 > knownModules (imported.begin (),
2960
+ imported.end ());
2961
+ SmallVector<clang::Module *, 8 > privateImports;
2962
+ std::copy_if (clangModule->Imports .begin (), clangModule->Imports .end (),
2963
+ std::back_inserter (privateImports), [&](clang::Module *mod) {
2964
+ return knownModules.count (mod) == 0 ;
2965
+ });
2966
+ imported.swap (privateImports);
2967
+ }
2949
2968
2950
- SmallVector<clang::Module *, 8 > imported;
2951
- clangModule->getExportedModules (imported);
2952
- if (filter != ModuleDecl::ImportFilter::Public) {
2953
- if (filter == ModuleDecl::ImportFilter::All) {
2954
- llvm::SmallPtrSet<clang::Module *, 8 > knownModules;
2955
- imported.append (clangModule->Imports .begin (), clangModule->Imports .end ());
2956
- imported.erase (std::remove_if (imported.begin (), imported.end (),
2957
- [&](clang::Module *mod) -> bool {
2958
- return !knownModules.insert (mod).second ;
2959
- }),
2960
- imported.end ());
2961
- } else {
2962
- llvm::SmallPtrSet<clang::Module *, 8 > knownModules (imported.begin (),
2963
- imported.end ());
2964
- SmallVector<clang::Module *, 8 > privateImports;
2965
- std::copy_if (clangModule->Imports .begin (), clangModule->Imports .end (),
2966
- std::back_inserter (privateImports), [&](clang::Module *mod) {
2967
- return knownModules.count (mod) == 0 ;
2968
- });
2969
- imported.swap (privateImports);
2969
+ // FIXME: The parent module isn't exactly a private import, but it is
2970
+ // needed for link dependencies.
2971
+ if (clangModule->Parent )
2972
+ imported.push_back (clangModule->Parent );
2970
2973
}
2971
-
2972
- // FIXME: The parent module isn't exactly a private import, but it is
2973
- // needed for link dependencies.
2974
- if (clangModule->Parent )
2975
- imported.push_back (clangModule->Parent );
2976
2974
}
2977
2975
2976
+ auto topLevelAdapter = getAdapterModule ();
2978
2977
for (auto importMod : imported) {
2979
2978
auto wrapper = owner.getWrapperForModule (importMod);
2980
2979
@@ -2983,11 +2982,12 @@ void ClangModuleUnit::getImportedModules(
2983
2982
// HACK: Deal with imports of submodules by importing the top-level module
2984
2983
// as well.
2985
2984
auto importTopLevel = importMod->getTopLevelModule ();
2986
- if (importTopLevel != importMod &&
2987
- importTopLevel != clangModule->getTopLevelModule ()) {
2988
- auto topLevelWrapper = owner.getWrapperForModule (importTopLevel);
2989
- imports.push_back ({ ModuleDecl::AccessPathTy (),
2990
- topLevelWrapper->getParentModule () });
2985
+ if (importTopLevel != importMod) {
2986
+ if (!clangModule || importTopLevel != clangModule->getTopLevelModule ()){
2987
+ auto topLevelWrapper = owner.getWrapperForModule (importTopLevel);
2988
+ imports.push_back ({ ModuleDecl::AccessPathTy (),
2989
+ topLevelWrapper->getParentModule () });
2990
+ }
2991
2991
}
2992
2992
actualMod = wrapper->getParentModule ();
2993
2993
} else if (actualMod == topLevelAdapter) {
@@ -3002,13 +3002,6 @@ void ClangModuleUnit::getImportedModules(
3002
3002
void ClangModuleUnit::getImportedModulesForLookup (
3003
3003
SmallVectorImpl<ModuleDecl::ImportedModule> &imports) const {
3004
3004
3005
- if (!clangModule) {
3006
- // This is the special "imported headers" module.
3007
- imports.append (owner.ImportedHeaderExports .begin (),
3008
- owner.ImportedHeaderExports .end ());
3009
- return ;
3010
- }
3011
-
3012
3005
// Reuse our cached list of imports if we have one.
3013
3006
if (!importedModulesForLookup.empty ()) {
3014
3007
imports.append (importedModulesForLookup.begin (),
@@ -3017,11 +3010,20 @@ void ClangModuleUnit::getImportedModulesForLookup(
3017
3010
}
3018
3011
3019
3012
size_t firstImport = imports.size ();
3020
- auto topLevel = clangModule->getTopLevelModule ();
3021
- auto topLevelAdapter = getAdapterModule ();
3022
3013
3023
3014
SmallVector<clang::Module *, 8 > imported;
3024
- clangModule->getExportedModules (imported);
3015
+ const clang::Module *topLevel;
3016
+ ModuleDecl *topLevelAdapter = getAdapterModule ();
3017
+ if (!clangModule) {
3018
+ // This is the special "imported headers" module.
3019
+ imported.append (owner.ImportedHeaderExports .begin (),
3020
+ owner.ImportedHeaderExports .end ());
3021
+ topLevel = nullptr ;
3022
+ } else {
3023
+ clangModule->getExportedModules (imported);
3024
+ topLevel = clangModule->getTopLevelModule ();
3025
+ }
3026
+
3025
3027
if (imported.empty ())
3026
3028
return ;
3027
3029
0 commit comments