@@ -3099,6 +3099,15 @@ static bool isDeclaredInModule(const ClangModuleUnit *ModuleFilter,
30993099 if (VD->getModuleContext ()->getName ().str () == CLANG_HEADER_MODULE_NAME) {
31003100 return true ;
31013101 }
3102+ // Because the ClangModuleUnit saved as a decl context will be saved as the top-level module, but
3103+ // the ModuleFilter we're given might be a submodule (if a submodule was passed to
3104+ // getTopLevelDecls, for example), we should compare the underlying Clang modules to determine
3105+ // module membership.
3106+ if (auto ClangNode = VD->getClangNode ()) {
3107+ if (auto *ClangModule = ClangNode.getOwningClangModule ()) {
3108+ return ModuleFilter->getClangModule () == ClangModule;
3109+ }
3110+ }
31023111 auto ContainingUnit = VD->getDeclContext ()->getModuleScopeContext ();
31033112 return ModuleFilter == ContainingUnit;
31043113}
@@ -3271,7 +3280,7 @@ class FilteringDeclaredDeclConsumer : public swift::VisibleDeclConsumer {
32713280 FilteringDeclaredDeclConsumer (swift::VisibleDeclConsumer &consumer,
32723281 const ClangModuleUnit *CMU)
32733282 : NextConsumer(consumer), ModuleFilter(CMU) {
3274- assert (CMU && CMU-> isTopLevel () && " Only top-level modules supported " );
3283+ assert (CMU);
32753284 }
32763285
32773286 void foundDecl (ValueDecl *VD, DeclVisibilityKind Reason,
@@ -3622,9 +3631,6 @@ class VectorDeclPtrConsumer : public swift::VisibleDeclConsumer {
36223631};
36233632} // unnamed namespace
36243633
3625- // FIXME(https://github.com/apple/swift-docc/issues/190): Should submodules still be crawled for the symbol graph?
3626- bool ClangModuleUnit::shouldCollectDisplayDecls () const { return isTopLevel (); }
3627-
36283634void ClangModuleUnit::getTopLevelDecls (SmallVectorImpl<Decl*> &results) const {
36293635 VectorDeclPtrConsumer consumer (results);
36303636 FilteringDeclaredDeclConsumer filterConsumer (consumer, this );
@@ -3645,10 +3651,12 @@ void ClangModuleUnit::getTopLevelDecls(SmallVectorImpl<Decl*> &results) const {
36453651
36463652 // Add the extensions produced by importing categories.
36473653 for (auto category : lookupTable->categories ()) {
3648- if (auto extension = cast_or_null<ExtensionDecl>(
3649- owner.importDecl (category, owner.CurrentVersion ,
3650- /* UseCanonical*/ false ))) {
3651- results.push_back (extension);
3654+ if (category->getOwningModule () == clangModule) {
3655+ if (auto extension = cast_or_null<ExtensionDecl>(
3656+ owner.importDecl (category, owner.CurrentVersion ,
3657+ /* UseCanonical*/ false ))) {
3658+ results.push_back (extension);
3659+ }
36523660 }
36533661 }
36543662
@@ -3663,11 +3671,11 @@ void ClangModuleUnit::getTopLevelDecls(SmallVectorImpl<Decl*> &results) const {
36633671 };
36643672 // Retrieve all of the globals that will be mapped to members.
36653673
3666- // FIXME: Since we don't represent Clang submodules as Swift
3667- // modules, we're getting everything.
36683674 llvm::SmallPtrSet<ExtensionDecl *, 8 > knownExtensions;
36693675 for (auto entry : lookupTable->allGlobalsAsMembers ()) {
36703676 auto decl = entry.get <clang::NamedDecl *>();
3677+ if (decl->getOwningModule () != clangModule) continue ;
3678+
36713679 Decl *importedDecl = owner.importDecl (decl, owner.CurrentVersion );
36723680 if (!importedDecl) continue ;
36733681
0 commit comments