Skip to content

Commit 2851a91

Browse files
committed
Improve showing import relations for C++20 modules
1 parent e3975ef commit 2851a91

3 files changed

Lines changed: 113 additions & 73 deletions

File tree

src/moduledef.cpp

Lines changed: 100 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,13 @@ void ModuleDefImpl::addHeader(int line,const QCString &headerName,bool isSystem)
185185
void ModuleDefImpl::addImport(int line,const QCString &moduleName,const QCString &partitionName,bool isExported)
186186
{
187187
AUTO_TRACE("name={}:line={},module={},partition={}",name(),line,moduleName,partitionName);
188-
m_imports.emplace(getDefFileName().str()+":"+std::to_string(line),ImportInfo(this,moduleName,line,partitionName,isExported));
188+
m_imports[getDefFileName().str()+":"+std::to_string(line)].push_back(ImportInfo(this,moduleName,line,partitionName,isExported));
189189
}
190190

191191
void ModuleDefImpl::addExportedModule(const QCString &moduleName,const ImportInfo &info)
192192
{
193193
AUTO_TRACE("name={}:moduleName={},import={}",name(),moduleName,info.importName);
194-
m_exportedModules.emplace(moduleName.str(),info);
194+
m_exportedModules[moduleName.str()].push_back(info);
195195
}
196196

197197
void ModuleDefImpl::addClassToModule(const Entry *root,ClassDef *cd)
@@ -886,32 +886,35 @@ void ModuleDefImpl::writeExports(OutputList &ol,const QCString &title)
886886
ol.parseText(title);
887887
ol.endMemberHeader();
888888
ol.startMemberList();
889-
for (auto &[moduleName,importInfo] : m_exportedModules)
889+
for (const auto &[moduleName,importInfoList] : m_exportedModules)
890890
{
891-
ModuleDef *mod = ModuleManager::instance().getPrimaryInterface(importInfo.importName);
892-
ol.startMemberDeclaration();
893-
ol.startMemberItem(importInfo.importName,OutputGenerator::MemberItemType::Normal);
894-
ol.docify(theTranslator->trModule(FALSE,TRUE)+" ");
895-
ol.insertMemberAlign();
896-
if (mod && mod->isLinkable())
891+
for (const auto &importInfo : importInfoList)
897892
{
898-
ol.writeObjectLink(mod->getReference(),mod->getOutputFileBase(),QCString(),mod->displayName());
899-
}
900-
else
901-
{
902-
ol.startBold();
903-
ol.docify(importInfo.importName);
904-
ol.endBold();
905-
}
906-
ol.endMemberItem(OutputGenerator::MemberItemType::Normal);
907-
if (mod && !mod->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
908-
{
909-
ol.startMemberDescription(mod->getOutputFileBase());
910-
ol.generateDoc(briefFile(),briefLine(),mod,nullptr,mod->briefDescription(),FALSE,FALSE,
911-
QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
912-
ol.endMemberDescription();
893+
ModuleDef *mod = ModuleManager::instance().getPrimaryInterface(importInfo.importName);
894+
ol.startMemberDeclaration();
895+
ol.startMemberItem(importInfo.importName,OutputGenerator::MemberItemType::Normal);
896+
ol.docify(theTranslator->trModule(FALSE,TRUE)+" ");
897+
ol.insertMemberAlign();
898+
if (mod && mod->isLinkable())
899+
{
900+
ol.writeObjectLink(mod->getReference(),mod->getOutputFileBase(),QCString(),mod->displayName());
901+
}
902+
else
903+
{
904+
ol.startBold();
905+
ol.docify(importInfo.importName);
906+
ol.endBold();
907+
}
908+
ol.endMemberItem(OutputGenerator::MemberItemType::Normal);
909+
if (mod && !mod->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
910+
{
911+
ol.startMemberDescription(mod->getOutputFileBase());
912+
ol.generateDoc(briefFile(),briefLine(),mod,nullptr,mod->briefDescription(),FALSE,FALSE,
913+
QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
914+
ol.endMemberDescription();
915+
}
916+
ol.endMemberDeclaration(QCString(),QCString());
913917
}
914-
ol.endMemberDeclaration(QCString(),QCString());
915918
}
916919
ol.endMemberList();
917920
}
@@ -1246,7 +1249,7 @@ void ModuleManager::addImport(const QCString &moduleFile,int line,const QCString
12461249
else // import outside of a module
12471250
{
12481251
AUTO_TRACE_ADD("outside module");
1249-
p->externalImports.emplace(moduleFile.str(),ImportInfo(nullptr,importName,line,partitionName));
1252+
p->externalImports[moduleFile.str()].emplace_back(nullptr,importName,line,partitionName);
12501253
}
12511254
}
12521255

@@ -1301,32 +1304,38 @@ void ModuleManager::addTagInfo(const QCString &fileName,const QCString &tagFile,
13011304
void ModuleManager::resolvePartitionsRecursively(ModuleDef *intfMod, ModuleDef *mod)
13021305
{
13031306
AUTO_TRACE();
1304-
for (auto &[partitionFileName,importInfo] : mod->getImports()) // foreach import
1307+
for (auto &[partitionFileName,importInfoList] : mod->getImports()) // foreach import
13051308
{
1306-
AUTO_TRACE_ADD("partitionFileName={} importName={} partitionName={}",
1307-
partitionFileName,importInfo.importName,importInfo.partitionName);
1308-
if (importInfo.importName==intfMod->name() && !importInfo.partitionName.isEmpty() &&
1309-
importInfo.exported) // that is an exported partition of this module
1309+
for (auto &importInfo : importInfoList)
13101310
{
1311-
auto it = p->moduleNameMap.find(importInfo.importName.str());
1312-
if (it != p->moduleNameMap.end())
1311+
AUTO_TRACE_ADD("partitionFileName={} importName={} partitionName={}",
1312+
partitionFileName,importInfo.importName,importInfo.partitionName);
1313+
if (importInfo.importName==intfMod->name() && !importInfo.partitionName.isEmpty() &&
1314+
importInfo.exported) // that is an exported partition of this module
13131315
{
1314-
for (auto importedMod : it->second)
1316+
auto it = p->moduleNameMap.find(importInfo.importName.str());
1317+
if (it != p->moduleNameMap.end())
13151318
{
1316-
if (importedMod->qualifiedName()==importInfo.importName+":"+importInfo.partitionName)
1319+
for (auto importedMod : it->second)
13171320
{
1318-
AUTO_TRACE_ADD("Interface module {} exports partition {}:{}",
1319-
mod->name(),importedMod->name(),importedMod->partitionName());
1320-
toModuleDefImpl(intfMod)->addPartition(toModuleDefImpl(importedMod));
1321-
toModuleDefImpl(importedMod)->setPrimaryInterface(intfMod);
1322-
for (const auto &[partitionFileName_,partitionImportInfo] : importedMod->getImports())
1321+
if (importedMod->qualifiedName()==importInfo.importName+":"+importInfo.partitionName)
13231322
{
1324-
if (partitionImportInfo.exported && intfMod->name()!=partitionImportInfo.importName)
1323+
AUTO_TRACE_ADD("Interface module {} exports partition {}:{}",
1324+
mod->name(),importedMod->name(),importedMod->partitionName());
1325+
toModuleDefImpl(intfMod)->addPartition(toModuleDefImpl(importedMod));
1326+
toModuleDefImpl(importedMod)->setPrimaryInterface(intfMod);
1327+
for (const auto &[partitionFileName_,partitionImportInfoList] : importedMod->getImports())
13251328
{
1326-
toModuleDefImpl(intfMod)->addExportedModule(partitionImportInfo.importName,partitionImportInfo);
1329+
for (const auto &partitionImportInfo : partitionImportInfoList)
1330+
{
1331+
if (partitionImportInfo.exported && intfMod->name()!=partitionImportInfo.importName)
1332+
{
1333+
toModuleDefImpl(intfMod)->addExportedModule(partitionImportInfo.importName,partitionImportInfo);
1334+
}
1335+
}
13271336
}
1337+
resolvePartitionsRecursively(intfMod,importedMod);
13281338
}
1329-
resolvePartitionsRecursively(intfMod,importedMod);
13301339
}
13311340
}
13321341
}
@@ -1345,11 +1354,14 @@ void ModuleManager::resolvePartitions()
13451354
}
13461355

13471356
// copy exported imports to m_exportedModules
1348-
for (const auto &[fileName,importInfo] : mod->getImports())
1357+
for (const auto &[fileName,importInfoList] : mod->getImports())
13491358
{
1350-
if (importInfo.exported && mod->name()!=importInfo.importName)
1359+
for (const auto &importInfo : importInfoList)
13511360
{
1352-
toModuleDefImpl(mod)->addExportedModule(importInfo.importName,importInfo);
1361+
if (importInfo.exported && mod->name()!=importInfo.importName)
1362+
{
1363+
toModuleDefImpl(mod)->addExportedModule(importInfo.importName,importInfo);
1364+
}
13531365
}
13541366
}
13551367

@@ -1372,37 +1384,61 @@ void ModuleManager::resolveImports()
13721384
FileDef *fd = mod->getFileDef();
13731385
if (fd)
13741386
{
1375-
for (const auto &[fileName,importInfo] : mod->getImports())
1387+
for (const auto &[fileName,importInfoList] : mod->getImports())
13761388
{
1377-
ModuleDef *importedModule = getPrimaryInterface(importInfo.importName);
1378-
const FileDef *importedFd = importedModule ? importedModule->getFileDef() : nullptr;
1379-
AUTO_TRACE_ADD("module: addIncludeDependency {}->{}:{} fd={}",
1380-
mod->qualifiedName(), importInfo.qualifiedName(), importInfo.line, fd?fd->absFilePath():"");
1381-
fd->addIncludeDependency(importedFd,importInfo.qualifiedName(),IncludeKind::ImportModule);
1389+
for (const auto &importInfo : importInfoList)
1390+
{
1391+
ModuleDef *importedModule = getPrimaryInterface(importInfo.importName);
1392+
const FileDef *importedFd = importedModule ? importedModule->getFileDef() : nullptr;
1393+
AUTO_TRACE_ADD("module: addIncludeDependency {}->{}:{} fd={}",
1394+
mod->qualifiedName(), importInfo.qualifiedName(), importInfo.line, fd?fd->absFilePath():"");
1395+
fd->addIncludeDependency(importedFd,importInfo.qualifiedName(),IncludeKind::ImportModule);
1396+
}
13821397
}
13831398
}
13841399
}
1385-
for (const auto &[fileName,importInfo] : p->externalImports)
1400+
for (const auto &[fileName,importInfoList] : p->externalImports)
13861401
{
1387-
bool ambig = false;
1388-
FileDef *fd = findFileDef(Doxygen::inputNameLinkedMap,QCString(fileName),ambig);
1389-
if (fd)
1402+
for (const auto &importInfo : importInfoList)
13901403
{
1391-
ModuleDef *mod = getPrimaryInterface(importInfo.importName);
1392-
FileDef *importedFd = mod ? mod->getFileDef() : nullptr;
1393-
fd->addIncludeDependency(importedFd,importInfo.importName,IncludeKind::ImportModule);
1404+
bool ambig = false;
1405+
FileDef *fd = findFileDef(Doxygen::inputNameLinkedMap,QCString(fileName),ambig);
1406+
AUTO_TRACE_ADD("externalImport name={} fd={}",fileName,(void*)fd);
1407+
if (fd)
1408+
{
1409+
ModuleDef *mod = getPrimaryInterface(importInfo.importName);
1410+
FileDef *importedFd = mod ? mod->getFileDef() : nullptr;
1411+
fd->addIncludeDependency(importedFd,importInfo.importName,IncludeKind::ImportModule);
1412+
if (importedFd)
1413+
{
1414+
importedFd->addIncludedByDependency(fd,stripFromPath(QCString(fileName)),IncludeKind::ImportModule);
1415+
}
1416+
}
1417+
else
1418+
{
1419+
fd->addIncludeDependency(nullptr,importInfo.importName,IncludeKind::ImportModule);
1420+
}
13941421
}
13951422
}
13961423
for (const auto &headerInfo : p->headers)
13971424
{
13981425
bool ambig = false;
13991426
FileDef *fd = findFileDef(Doxygen::inputNameLinkedMap,headerInfo.fileName,ambig);
1427+
AUTO_TRACE_ADD("header name={} fd={}",headerInfo.fileName,(void*)fd);
14001428
if (fd)
14011429
{
14021430
QCString resolvedHeader = determineAbsoluteIncludeName(headerInfo.fileName,headerInfo.headerName);
14031431
FileDef *importFd = findFileDef(Doxygen::inputNameLinkedMap,resolvedHeader,ambig);
14041432
fd->addIncludeDependency(importFd, headerInfo.headerName,
14051433
headerInfo.isSystem ? IncludeKind::ImportSystem : IncludeKind::ImportLocal);
1434+
if (importFd)
1435+
{
1436+
importFd->addIncludedByDependency(fd,headerInfo.fileName,IncludeKind::ImportModule);
1437+
}
1438+
}
1439+
else
1440+
{
1441+
fd->addIncludeDependency(nullptr,headerInfo.headerName,IncludeKind::ImportModule);
14061442
}
14071443
}
14081444
}
@@ -1468,7 +1504,7 @@ void ModuleManager::writeDocumentation(OutputList &ol)
14681504
int ModuleManager::numDocumentedModules() const
14691505
{
14701506
int count=0;
1471-
for (auto &mod : p->moduleFileMap) // foreach module
1507+
for (const auto &mod : p->moduleFileMap) // foreach module
14721508
{
14731509
if (mod->isPrimaryInterface()) count++;
14741510
}
@@ -1523,7 +1559,7 @@ ModuleDef *ModuleManager::getPrimaryInterface(const QCString &moduleName) const
15231559
auto it = p->moduleNameMap.find(moduleName.str());
15241560
if (it != p->moduleNameMap.end())
15251561
{
1526-
for (auto &mod : it->second)
1562+
for (const auto &mod : it->second)
15271563
{
15281564
if (mod->isPrimaryInterface())
15291565
{
@@ -1536,23 +1572,23 @@ ModuleDef *ModuleManager::getPrimaryInterface(const QCString &moduleName) const
15361572

15371573
void ModuleManager::addListReferences()
15381574
{
1539-
for (auto &mod : p->moduleFileMap) // foreach module
1575+
for (const auto &mod : p->moduleFileMap) // foreach module
15401576
{
15411577
if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->addListReferences();
15421578
}
15431579
}
15441580

15451581
void ModuleManager::addMembersToMemberGroup()
15461582
{
1547-
for (auto &mod : p->moduleFileMap) // foreach module
1583+
for (const auto &mod : p->moduleFileMap) // foreach module
15481584
{
15491585
if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->addMembersToMemberGroup();
15501586
}
15511587
}
15521588

15531589
void ModuleManager::distributeMemberGroupDocumentation()
15541590
{
1555-
for (auto &mod : p->moduleFileMap) // foreach module
1591+
for (const auto &mod : p->moduleFileMap) // foreach module
15561592
{
15571593
if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->distributeMemberGroupDocumentation();
15581594
}

src/moduledef.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@ struct ImportInfo
5656
}
5757
};
5858

59+
using ImportInfoList = std::vector<ImportInfo>;
5960
using ModuleMap = std::unordered_map<std::string,ModuleDef *>;
60-
using ImportInfoMap = std::unordered_map<std::string,ImportInfo>;
61+
using ImportInfoMap = std::unordered_map<std::string,ImportInfoList>;
6162

6263

6364
class ModuleDef : public DefinitionMutable, public Definition

src/xmlgen.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,17 +1352,20 @@ static void writeExports(const ImportInfoMap &exportMap,TextStream &t)
13521352
{
13531353
if (exportMap.empty()) return;
13541354
t << " <exports>\n";
1355-
for (auto &[moduleName,importInfo] : exportMap)
1355+
for (const auto &[moduleName,importInfoList] : exportMap)
13561356
{
1357-
t << " <export";
1358-
ModuleDef *mod = ModuleManager::instance().getPrimaryInterface(importInfo.importName);
1359-
if (mod && mod->isLinkableInProject())
1357+
for (const auto &importInfo : importInfoList)
13601358
{
1361-
t << " refid=\"" << mod->getOutputFileBase() << "\"";
1359+
t << " <export";
1360+
ModuleDef *mod = ModuleManager::instance().getPrimaryInterface(importInfo.importName);
1361+
if (mod && mod->isLinkableInProject())
1362+
{
1363+
t << " refid=\"" << mod->getOutputFileBase() << "\"";
1364+
}
1365+
t << ">";
1366+
t << importInfo.importName;
1367+
t << "</export>\n";
13621368
}
1363-
t << ">";
1364-
t << importInfo.importName;
1365-
t << "</export>\n";
13661369
}
13671370
t << " </exports>\n";
13681371
}

0 commit comments

Comments
 (0)