@@ -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 {
@@ -3015,45 +3015,44 @@ void ClangModuleUnit::getImportedModules(
3015
3015
if (filter != ModuleDecl::ImportFilter::Public)
3016
3016
imports.push_back ({ModuleDecl::AccessPathTy (), owner.getStdlibModule ()});
3017
3017
3018
+ SmallVector<clang::Module *, 8 > imported;
3018
3019
if (!clangModule) {
3019
3020
// This is the special "imported headers" module.
3020
3021
if (filter != ModuleDecl::ImportFilter::Private) {
3021
- imports .append (owner.ImportedHeaderExports .begin (),
3022
- owner.ImportedHeaderExports .end ());
3022
+ imported .append (owner.ImportedHeaderExports .begin (),
3023
+ owner.ImportedHeaderExports .end ());
3023
3024
}
3024
- return ;
3025
- }
3026
3025
3027
- auto topLevelAdapter = getAdapterModule ();
3026
+ } else {
3027
+ clangModule->getExportedModules (imported);
3028
+ if (filter != ModuleDecl::ImportFilter::Public) {
3029
+ if (filter == ModuleDecl::ImportFilter::All) {
3030
+ llvm::SmallPtrSet<clang::Module *, 8 > knownModules;
3031
+ imported.append (clangModule->Imports .begin (), clangModule->Imports .end ());
3032
+ imported.erase (std::remove_if (imported.begin (), imported.end (),
3033
+ [&](clang::Module *mod) -> bool {
3034
+ return !knownModules.insert (mod).second ;
3035
+ }),
3036
+ imported.end ());
3037
+ } else {
3038
+ llvm::SmallPtrSet<clang::Module *, 8 > knownModules (imported.begin (),
3039
+ imported.end ());
3040
+ SmallVector<clang::Module *, 8 > privateImports;
3041
+ std::copy_if (clangModule->Imports .begin (), clangModule->Imports .end (),
3042
+ std::back_inserter (privateImports), [&](clang::Module *mod) {
3043
+ return knownModules.count (mod) == 0 ;
3044
+ });
3045
+ imported.swap (privateImports);
3046
+ }
3028
3047
3029
- SmallVector<clang::Module *, 8 > imported;
3030
- clangModule->getExportedModules (imported);
3031
- if (filter != ModuleDecl::ImportFilter::Public) {
3032
- if (filter == ModuleDecl::ImportFilter::All) {
3033
- llvm::SmallPtrSet<clang::Module *, 8 > knownModules;
3034
- imported.append (clangModule->Imports .begin (), clangModule->Imports .end ());
3035
- imported.erase (std::remove_if (imported.begin (), imported.end (),
3036
- [&](clang::Module *mod) -> bool {
3037
- return !knownModules.insert (mod).second ;
3038
- }),
3039
- imported.end ());
3040
- } else {
3041
- llvm::SmallPtrSet<clang::Module *, 8 > knownModules (imported.begin (),
3042
- imported.end ());
3043
- SmallVector<clang::Module *, 8 > privateImports;
3044
- std::copy_if (clangModule->Imports .begin (), clangModule->Imports .end (),
3045
- std::back_inserter (privateImports), [&](clang::Module *mod) {
3046
- return knownModules.count (mod) == 0 ;
3047
- });
3048
- imported.swap (privateImports);
3048
+ // FIXME: The parent module isn't exactly a private import, but it is
3049
+ // needed for link dependencies.
3050
+ if (clangModule->Parent )
3051
+ imported.push_back (clangModule->Parent );
3049
3052
}
3050
-
3051
- // FIXME: The parent module isn't exactly a private import, but it is
3052
- // needed for link dependencies.
3053
- if (clangModule->Parent )
3054
- imported.push_back (clangModule->Parent );
3055
3053
}
3056
3054
3055
+ auto topLevelAdapter = getAdapterModule ();
3057
3056
for (auto importMod : imported) {
3058
3057
auto wrapper = owner.getWrapperForModule (importMod);
3059
3058
@@ -3062,11 +3061,12 @@ void ClangModuleUnit::getImportedModules(
3062
3061
// HACK: Deal with imports of submodules by importing the top-level module
3063
3062
// as well.
3064
3063
auto importTopLevel = importMod->getTopLevelModule ();
3065
- if (importTopLevel != importMod &&
3066
- importTopLevel != clangModule->getTopLevelModule ()) {
3067
- auto topLevelWrapper = owner.getWrapperForModule (importTopLevel);
3068
- imports.push_back ({ ModuleDecl::AccessPathTy (),
3069
- topLevelWrapper->getParentModule () });
3064
+ if (importTopLevel != importMod) {
3065
+ if (!clangModule || importTopLevel != clangModule->getTopLevelModule ()){
3066
+ auto topLevelWrapper = owner.getWrapperForModule (importTopLevel);
3067
+ imports.push_back ({ ModuleDecl::AccessPathTy (),
3068
+ topLevelWrapper->getParentModule () });
3069
+ }
3070
3070
}
3071
3071
actualMod = wrapper->getParentModule ();
3072
3072
} else if (actualMod == topLevelAdapter) {
@@ -3081,13 +3081,6 @@ void ClangModuleUnit::getImportedModules(
3081
3081
void ClangModuleUnit::getImportedModulesForLookup (
3082
3082
SmallVectorImpl<ModuleDecl::ImportedModule> &imports) const {
3083
3083
3084
- if (!clangModule) {
3085
- // This is the special "imported headers" module.
3086
- imports.append (owner.ImportedHeaderExports .begin (),
3087
- owner.ImportedHeaderExports .end ());
3088
- return ;
3089
- }
3090
-
3091
3084
// Reuse our cached list of imports if we have one.
3092
3085
if (!importedModulesForLookup.empty ()) {
3093
3086
imports.append (importedModulesForLookup.begin (),
@@ -3096,11 +3089,20 @@ void ClangModuleUnit::getImportedModulesForLookup(
3096
3089
}
3097
3090
3098
3091
size_t firstImport = imports.size ();
3099
- auto topLevel = clangModule->getTopLevelModule ();
3100
- auto topLevelAdapter = getAdapterModule ();
3101
3092
3102
3093
SmallVector<clang::Module *, 8 > imported;
3103
- clangModule->getExportedModules (imported);
3094
+ const clang::Module *topLevel;
3095
+ ModuleDecl *topLevelAdapter = getAdapterModule ();
3096
+ if (!clangModule) {
3097
+ // This is the special "imported headers" module.
3098
+ imported.append (owner.ImportedHeaderExports .begin (),
3099
+ owner.ImportedHeaderExports .end ());
3100
+ topLevel = nullptr ;
3101
+ } else {
3102
+ clangModule->getExportedModules (imported);
3103
+ topLevel = clangModule->getTopLevelModule ();
3104
+ }
3105
+
3104
3106
if (imported.empty ())
3105
3107
return ;
3106
3108
0 commit comments