Skip to content

Commit 84a0779

Browse files
authored
Merge pull request #74812 from al45tair/eng/PR-130527640
[AST] Rewrite collectExportedImports() to be non-recursive.
2 parents deb81bc + eb9a5f7 commit 84a0779

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

lib/AST/Module.cpp

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,31 +1535,36 @@ void ModuleDecl::ImportCollector::collect(
15351535
}
15361536

15371537
static void
1538-
collectExportedImports(const ModuleDecl *module,
1538+
collectExportedImports(const ModuleDecl *topLevelModule,
15391539
ModuleDecl::ImportCollector &importCollector) {
1540-
for (const FileUnit *file : module->getFiles()) {
1541-
if (const SourceFile *source = dyn_cast<SourceFile>(file)) {
1542-
if (source->hasImports()) {
1543-
for (const auto &import : source->getImports()) {
1544-
if (import.options.contains(ImportFlags::Exported) &&
1545-
import.docVisibility.value_or(AccessLevel::Public) >=
1546-
importCollector.minimumDocVisibility) {
1547-
importCollector.collect(import.module);
1548-
collectExportedImports(import.module.importedModule,
1549-
importCollector);
1540+
SmallVector<const ModuleDecl *> stack;
1541+
stack.push_back(topLevelModule);
1542+
while (!stack.empty()) {
1543+
const ModuleDecl *module = stack.pop_back_val();
1544+
1545+
for (const FileUnit *file : module->getFiles()) {
1546+
if (const SourceFile *source = dyn_cast<SourceFile>(file)) {
1547+
if (source->hasImports()) {
1548+
for (const auto &import : source->getImports()) {
1549+
if (import.options.contains(ImportFlags::Exported) &&
1550+
import.docVisibility.value_or(AccessLevel::Public) >=
1551+
importCollector.minimumDocVisibility) {
1552+
importCollector.collect(import.module);
1553+
stack.push_back(import.module.importedModule);
1554+
}
15501555
}
15511556
}
1552-
}
1553-
} else {
1554-
SmallVector<ImportedModule, 8> exportedImports;
1555-
file->getImportedModules(exportedImports,
1556-
ModuleDecl::ImportFilterKind::Exported);
1557-
for (const auto &im : exportedImports) {
1558-
// Skip collecting the underlying clang module as we already have the relevant import.
1559-
if (module->isClangOverlayOf(im.importedModule))
1560-
continue;
1561-
importCollector.collect(im);
1562-
collectExportedImports(im.importedModule, importCollector);
1557+
} else {
1558+
SmallVector<ImportedModule, 8> exportedImports;
1559+
file->getImportedModules(exportedImports,
1560+
ModuleDecl::ImportFilterKind::Exported);
1561+
for (const auto &im : exportedImports) {
1562+
// Skip collecting the underlying clang module as we already have the relevant import.
1563+
if (module->isClangOverlayOf(im.importedModule))
1564+
continue;
1565+
importCollector.collect(im);
1566+
stack.push_back(im.importedModule);
1567+
}
15631568
}
15641569
}
15651570
}

0 commit comments

Comments
 (0)