Doxygen
Loading...
Searching...
No Matches
ModuleManager Class Reference

#include <src/moduledef.h>

Classes

struct  Private

Public Member Functions

void createModuleDef (const DString &fileName, int line, size_t column, bool exported, const DString &moduleName, const DString &partitionName=DString())
void clear ()
void addHeader (const DString &moduleFile, int line, const DString &headerName, bool isSystem)
void addImport (const DString &moduleFile, int line, const DString &importName, bool isExported, const DString &partitionName=DString())
void addClassToModule (const Entry *root, ClassDef *cd)
void addConceptToModule (const Entry *root, ConceptDef *cd)
void addMemberToModule (const Entry *root, MemberDef *md)
void addDocs (const Entry *root)
void addTagInfo (const DString &moduleFile, const DString &tagName, const DString &clangId)
void addListReferences ()
void addRequirementReferences ()
void addMembersToMemberGroup ()
void distributeMemberGroupDocumentation ()
void findSectionsInDocumentation ()
void sortMemberLists ()
void resolvePartitions ()
void resolveImports ()
void collectExportedSymbols ()
void countMembers ()
void writeDocumentation (OutputList &ol)
int numDocumentedModules () const
ModuleLinkedMap & modules ()
const ModuleLinkedMap & modules () const
ModuleDef * getPrimaryInterface (const DString &moduleName) const

Static Public Member Functions

static ModuleManager & instance ()

Private Member Functions

 ModuleManager ()
 ~ModuleManager ()=default
void resolvePartitionsRecursively (ModuleDef *intfMod, ModuleDef *mod)
void collectExportedSymbolsRecursively (ModuleDef *intfMod, ModuleDef *mod)

Private Attributes

std::unique_ptr< Private > p

Detailed Description

Definition at line 110 of file moduledef.h.

Constructor & Destructor Documentation

◆ ModuleManager()

ModuleManager::ModuleManager ( )
private

Definition at line 1272 of file moduledef.cpp.

1272 : p(std::make_unique<Private>())
1273{
1274}
std::unique_ptr< Private > p
Definition moduledef.h:148

References p.

Referenced by instance(), and ~ModuleManager().

◆ ~ModuleManager()

ModuleManager::~ModuleManager ( )
privatedefault

References ModuleManager().

Member Function Documentation

◆ addClassToModule()

void ModuleManager::addClassToModule ( const Entry * root,
ClassDef * cd )

Definition at line 1342 of file moduledef.cpp.

1343{
1344 std::lock_guard lock(p->mutex);
1345 auto mod = p->moduleFileMap.find(root->fileName);
1346 if (mod)
1347 {
1348 toModuleDefImpl(mod)->addClassToModule(root,cd);
1349 auto cdm = toClassDefMutable(cd);
1350 if (cdm) cdm->setModuleDef(mod);
1351 }
1352}
DString fileName
file this entry was extracted from
Definition entry.h:223
void addClassToModule(const Entry *root, ClassDef *cd)
ClassDefMutable * toClassDefMutable(Definition *d)
static ModuleDefImpl * toModuleDefImpl(ModuleDef *m)

References ModuleDefImpl::addClassToModule(), Entry::fileName, p, toClassDefMutable(), and toModuleDefImpl().

Referenced by addClassToContext().

◆ addConceptToModule()

void ModuleManager::addConceptToModule ( const Entry * root,
ConceptDef * cd )

Definition at line 1354 of file moduledef.cpp.

1355{
1356 std::lock_guard lock(p->mutex);
1357 auto mod = p->moduleFileMap.find(root->fileName);
1358 if (mod)
1359 {
1360 toModuleDefImpl(mod)->addConceptToModule(root,cd);
1361 auto cdm = toConceptDefMutable(cd);
1362 if (cdm) cdm->setModuleDef(mod);
1363 }
1364}
void addConceptToModule(const Entry *root, ConceptDef *cd)
ConceptDefMutable * toConceptDefMutable(Definition *d)

References ModuleDefImpl::addConceptToModule(), Entry::fileName, p, toConceptDefMutable(), and toModuleDefImpl().

Referenced by addConceptToContext().

◆ addDocs()

void ModuleManager::addDocs ( const Entry * root)

Definition at line 1602 of file moduledef.cpp.

1603{
1604 AUTO_TRACE("file={} module={}",root->fileName,root->name);
1605 if (root->doc.empty() && root->brief.empty()) return;
1606 if (root->name.find(':')!=DString::npos)
1607 {
1608 warn(root->fileName,root->startLine,"Ignoring documentation for module partition {}. Please place documentation at the primary module name",
1609 root->name);
1610 }
1611 else
1612 {
1613 auto it = p->moduleNameMap.find(root->name.str());
1614 if (it != p->moduleNameMap.end())
1615 {
1616 ModuleDef *mod = getPrimaryInterface(root->name);
1617 if (mod)
1618 {
1619 mod->setDocumentation(root->doc,root->docFile,root->docLine);
1620 mod->setBriefDescription(root->brief,root->briefFile,root->briefLine);
1621 mod->setId(root->id);
1622 mod->setHidden(root->hidden);
1623 mod->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
1624 mod->setRefItems(root->sli);
1625 mod->setRequirementReferences(root->rqli);
1626 //mod->addSectionsToDefinition(root->anchors);
1627 addModuleToGroups(root,mod);
1628 }
1629 else
1630 {
1631 warn(root->fileName,root->startLine,"Found documentation for module {} but it has no primary interface unit.",root->name);
1632 }
1633 }
1634 else
1635 {
1636 warn(root->fileName,root->startLine,"Found documentation for unknown module {}.",root->name);
1637 }
1638 }
1639}
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
const std::string & str() const
Definition dstring.h:645
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setHidden(bool b)=0
virtual void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true)=0
virtual void setBriefDescription(const DString &b, const DString &briefFile, int briefLine)=0
virtual void setRequirementReferences(const RequirementRefs &rqli)=0
virtual void setId(const DString &name)=0
virtual void setRefItems(const RefItemVector &sli)=0
RequirementRefs rqli
references to requirements
Definition entry.h:227
int docLine
line number at which the documentation was found
Definition entry.h:201
int endBodyLine
line number where the definition ends
Definition entry.h:218
DString docFile
file in which the documentation was found
Definition entry.h:202
DString doc
documentation block (partly parsed)
Definition entry.h:200
DString brief
brief description (doc block)
Definition entry.h:203
int startLine
start line of entry in the source
Definition entry.h:224
int bodyLine
line number of the body in the source
Definition entry.h:216
DString name
member name
Definition entry.h:173
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
Definition entry.h:226
bool hidden
does this represent an entity that is hidden from the output
Definition entry.h:229
int briefLine
line number at which the brief desc. was found
Definition entry.h:204
DString id
libclang id
Definition entry.h:232
DString briefFile
file in which the brief desc. was found
Definition entry.h:205
ModuleDef * getPrimaryInterface(const DString &moduleName) const
#define AUTO_TRACE(...)
Definition docnode.cpp:53
void addModuleToGroups(const Entry *root, ModuleDef *mod)
#define warn(file, line, fmt,...)
Definition message.h:97

References addModuleToGroups(), AUTO_TRACE, Entry::bodyLine, Entry::brief, Entry::briefFile, Entry::briefLine, Entry::doc, Entry::docFile, Entry::docLine, DString::empty(), Entry::endBodyLine, Entry::fileName, DString::find(), getPrimaryInterface(), Entry::hidden, Entry::id, Entry::name, DString::npos, p, Entry::rqli, DefinitionMutable::setBodySegment(), DefinitionMutable::setBriefDescription(), DefinitionMutable::setDocumentation(), DefinitionMutable::setHidden(), DefinitionMutable::setId(), DefinitionMutable::setRefItems(), DefinitionMutable::setRequirementReferences(), Entry::sli, Entry::startLine, DString::str(), and warn.

Referenced by findModuleDocumentation().

◆ addHeader()

void ModuleManager::addHeader ( const DString & moduleFile,
int line,
const DString & headerName,
bool isSystem )

Definition at line 1307 of file moduledef.cpp.

1308{
1309 AUTO_TRACE("{}:{} headerName={} isSystem={}",moduleFile,line,headerName,isSystem);
1310 std::lock_guard lock(p->mutex);
1311 auto mod = p->moduleFileMap.find(moduleFile);
1312 if (mod)
1313 {
1314 toModuleDefImpl(mod)->addHeader(line,headerName,isSystem);
1315 }
1316 else
1317 {
1318 AUTO_TRACE_ADD("imported header '{}' found in file '{}' that is not a module",headerName,moduleFile);
1319 }
1320 p->headers.emplace_back(moduleFile,headerName,isSystem);
1321}
void addHeader(int line, const DString &headerName, bool isSystem)
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:54

References ModuleDefImpl::addHeader(), AUTO_TRACE, AUTO_TRACE_ADD, p, and toModuleDefImpl().

◆ addImport()

void ModuleManager::addImport ( const DString & moduleFile,
int line,
const DString & importName,
bool isExported,
const DString & partitionName = DString() )

Definition at line 1323 of file moduledef.cpp.

1325{
1326 AUTO_TRACE("{}:{} importName={},isExported={},partitionName={}",
1327 moduleFile,line,importName,isExported,partitionName);
1328 std::lock_guard lock(p->mutex);
1329 auto mod = p->moduleFileMap.find(moduleFile);
1330 if (mod) // import inside a module
1331 {
1332 AUTO_TRACE_ADD("in module");
1333 toModuleDefImpl(mod)->addImport(line,importName.empty()?mod->name():importName,partitionName,isExported);
1334 }
1335 else // import outside of a module
1336 {
1337 AUTO_TRACE_ADD("outside module");
1338 p->externalImports[moduleFile.str()].emplace_back(nullptr,importName,line,partitionName);
1339 }
1340}
void addImport(int line, const DString &moduleName, const DString &partitionName, bool isExported)

References ModuleDefImpl::addImport(), AUTO_TRACE, AUTO_TRACE_ADD, DString::empty(), p, DString::str(), and toModuleDefImpl().

◆ addListReferences()

void ModuleManager::addListReferences ( )

Definition at line 1657 of file moduledef.cpp.

1658{
1659 for (const auto &mod : p->moduleFileMap) // foreach module
1660 {
1661 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->addListReferences();
1662 }
1663}
void addListReferences()

References ModuleDefImpl::addListReferences(), p, and toModuleDefImpl().

◆ addMembersToMemberGroup()

void ModuleManager::addMembersToMemberGroup ( )

Definition at line 1673 of file moduledef.cpp.

1674{
1675 for (const auto &mod : p->moduleFileMap) // foreach module
1676 {
1677 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->addMembersToMemberGroup();
1678 }
1679}
void addMembersToMemberGroup()

References ModuleDefImpl::addMembersToMemberGroup(), p, and toModuleDefImpl().

Referenced by addMembersToMemberGroup().

◆ addMemberToModule()

void ModuleManager::addMemberToModule ( const Entry * root,
MemberDef * md )

Definition at line 1366 of file moduledef.cpp.

1367{
1368 std::lock_guard lock(p->mutex);
1369 auto mod = p->moduleFileMap.find(root->fileName);
1370 if (mod && root->exported && md->getClassDef()==nullptr)
1371 {
1372 toModuleDefImpl(mod)->addMemberToModule(root,md);
1373 auto mdm = toMemberDefMutable(md);
1374 if (mdm) mdm->setModuleDef(mod);
1375 }
1376}
bool exported
is the symbol exported from a C++20 module
Definition entry.h:188
virtual const ClassDef * getClassDef() const =0
void addMemberToModule(const Entry *root, MemberDef *md)
MemberDefMutable * toMemberDefMutable(Definition *d)

References ModuleDefImpl::addMemberToModule(), Entry::exported, Entry::fileName, MemberDef::getClassDef(), p, toMemberDefMutable(), and toModuleDefImpl().

Referenced by addDefineDoc(), addEnumDocs(), addGlobalFunction(), addInterfaceOrServiceToServiceOrSingleton(), addMemberDocs(), addMethodToClass(), addVariableToClass(), addVariableToFile(), buildFunctionList(), findEnums(), and findMember().

◆ addRequirementReferences()

void ModuleManager::addRequirementReferences ( )

Definition at line 1665 of file moduledef.cpp.

1666{
1667 for (const auto &mod : p->moduleFileMap) // foreach module
1668 {
1669 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->addRequirementReferences();
1670 }
1671}
void addRequirementReferences()

References ModuleDefImpl::addRequirementReferences(), p, and toModuleDefImpl().

◆ addTagInfo()

void ModuleManager::addTagInfo ( const DString & moduleFile,
const DString & tagName,
const DString & clangId )

Definition at line 1378 of file moduledef.cpp.

1379{
1380 std::lock_guard lock(p->mutex);
1381 auto mod = p->moduleFileMap.find(fileName);
1382 if (mod)
1383 {
1384 ModuleDefImpl *modi = toModuleDefImpl(mod);
1385 modi->setReference(tagFile);
1386 modi->setId(clangId);
1387 }
1388}
void setId(const DString &name) override
void setReference(const DString &r) override

References p, DefinitionMixin< Base >::setId(), DefinitionMixin< Base >::setReference(), and toModuleDefImpl().

◆ clear()

void ModuleManager::clear ( )

Definition at line 1298 of file moduledef.cpp.

1299{
1300 std::lock_guard lock(p->mutex);
1301 p->headers.clear();
1302 p->externalImports.clear();
1303 p->moduleNameMap.clear();
1304 p->moduleFileMap.clear();
1305}

References p.

Referenced by cleanUpDoxygen().

◆ collectExportedSymbols()

void ModuleManager::collectExportedSymbols ( )

Definition at line 1532 of file moduledef.cpp.

1533{
1534 AUTO_TRACE();
1535 for (auto &mod : p->moduleFileMap) // foreach module
1536 {
1537 if (mod->isPrimaryInterface()) // that is a primary interface
1538 {
1539 for (auto &[partitionName,partitionMod] : mod->partitions())
1540 {
1541 collectExportedSymbolsRecursively(mod.get(),partitionMod);
1542 }
1543
1544 // collect all files that contribute to this module (e.g. implementation/partition modules)
1545 auto it = p->moduleNameMap.find(mod->name().str());
1546 if (it != p->moduleNameMap.end())
1547 {
1548 for (auto contributingMod : it->second)
1549 {
1550 AUTO_TRACE_ADD(" adding contributing module {} to interface module {} type={} partition={} isPrimaryIntf={}",
1551 contributingMod->qualifiedName(),
1552 mod->name(),
1553 contributingMod->moduleType()==ModuleDef::Type::Interface ? "Interface" : "Implementation",
1554 contributingMod->partitionName(),
1555 contributingMod->isPrimaryInterface());
1557 }
1558 }
1559 }
1560 }
1561}
void addContributingModule(ModuleDefImpl *mod)
void collectExportedSymbolsRecursively(ModuleDef *intfMod, ModuleDef *mod)

References ModuleDefImpl::addContributingModule(), AUTO_TRACE, AUTO_TRACE_ADD, collectExportedSymbolsRecursively(), ModuleDef::Interface, p, and toModuleDefImpl().

◆ collectExportedSymbolsRecursively()

void ModuleManager::collectExportedSymbolsRecursively ( ModuleDef * intfMod,
ModuleDef * mod )
private

Definition at line 1524 of file moduledef.cpp.

1525{
1526 AUTO_TRACE("{}: collecting symbols for partition {}",intfMod->qualifiedName(),partitionMod->qualifiedName());
1527 auto intfModImpl = toModuleDefImpl(intfMod);
1528 auto partitionModImpl = toModuleDefImpl(partitionMod);
1529 intfModImpl->mergeSymbolsFrom(partitionModImpl);
1530}
virtual DString qualifiedName() const =0

References AUTO_TRACE, Definition::qualifiedName(), and toModuleDefImpl().

Referenced by collectExportedSymbols().

◆ countMembers()

void ModuleManager::countMembers ( )

Definition at line 1563 of file moduledef.cpp.

1564{
1565 for (auto &mod : p->moduleFileMap) // foreach module
1566 {
1568 }
1569}
void countMembers()

References ModuleDefImpl::countMembers(), p, and toModuleDefImpl().

◆ createModuleDef()

void ModuleManager::createModuleDef ( const DString & fileName,
int line,
size_t column,
bool exported,
const DString & moduleName,
const DString & partitionName = DString() )

Definition at line 1276 of file moduledef.cpp.

1278{
1279 AUTO_TRACE("{}:{}: Found module name='{}' partition='{}' exported='{}'",
1280 fileName,line,moduleName,partitionName,exported);
1281 std::lock_guard lock(p->mutex);
1283 std::unique_ptr<ModuleDef> modDef = std::make_unique<ModuleDefImpl>(fileName,line,column,moduleName,mt,partitionName);
1284 auto mod = p->moduleFileMap.add(fileName,std::move(modDef));
1285 auto it = p->moduleNameMap.find(moduleName.str());
1286 if (it == p->moduleNameMap.end())
1287 {
1288 ModuleList ml;
1289 ml.push_back(mod);
1290 p->moduleNameMap.emplace(moduleName.str(),ml);
1291 }
1292 else
1293 {
1294 it->second.push_back(mod);
1295 }
1296}

References AUTO_TRACE, ModuleDef::Implementation, ModuleDef::Interface, p, and DString::str().

◆ distributeMemberGroupDocumentation()

void ModuleManager::distributeMemberGroupDocumentation ( )

Definition at line 1681 of file moduledef.cpp.

1682{
1683 for (const auto &mod : p->moduleFileMap) // foreach module
1684 {
1685 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->distributeMemberGroupDocumentation();
1686 }
1687}
void distributeMemberGroupDocumentation()

References ModuleDefImpl::distributeMemberGroupDocumentation(), p, and toModuleDefImpl().

Referenced by distributeMemberGroupDocumentation().

◆ findSectionsInDocumentation()

void ModuleManager::findSectionsInDocumentation ( )

Definition at line 1689 of file moduledef.cpp.

1690{
1691 for (auto &mod : p->moduleFileMap) // foreach module
1692 {
1693 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->findSectionsInDocumentation();
1694 }
1695}
void findSectionsInDocumentation()

References ModuleDefImpl::findSectionsInDocumentation(), p, and toModuleDefImpl().

Referenced by findSectionsInDocumentation().

◆ getPrimaryInterface()

ModuleDef * ModuleManager::getPrimaryInterface ( const DString & moduleName) const

Definition at line 1641 of file moduledef.cpp.

1642{
1643 auto it = p->moduleNameMap.find(moduleName.str());
1644 if (it != p->moduleNameMap.end())
1645 {
1646 for (const auto &mod : it->second)
1647 {
1648 if (mod->isPrimaryInterface())
1649 {
1650 return mod;
1651 }
1652 }
1653 }
1654 return nullptr;
1655}

References p, and DString::str().

Referenced by addDocs(), resolveImports(), ModuleDefImpl::writeExports(), writeExports(), and FileDefImpl::writeIncludeFiles().

◆ instance()

◆ modules() [1/2]

ModuleLinkedMap & ModuleManager::modules ( )

Definition at line 1597 of file moduledef.cpp.

1598{
1599 return p->moduleFileMap;
1600}

References p.

◆ modules() [2/2]

const ModuleLinkedMap & ModuleManager::modules ( ) const

Definition at line 1592 of file moduledef.cpp.

1593{
1594 return p->moduleFileMap;
1595}

References p.

◆ numDocumentedModules()

int ModuleManager::numDocumentedModules ( ) const

Definition at line 1582 of file moduledef.cpp.

1583{
1584 int count=0;
1585 for (const auto &mod : p->moduleFileMap) // foreach module
1586 {
1587 if (mod->isPrimaryInterface()) count++;
1588 }
1589 return count;
1590}

References p.

Referenced by Index::countDataStructures().

◆ resolveImports()

void ModuleManager::resolveImports ( )

Definition at line 1465 of file moduledef.cpp.

1466{
1467 AUTO_TRACE();
1468 for (auto &mod : p->moduleFileMap)
1469 {
1470 FileDef *fd = mod->getFileDef();
1471 if (fd)
1472 {
1473 for (const auto &[fileName,importInfoList] : mod->getImports())
1474 {
1475 for (const auto &importInfo : importInfoList)
1476 {
1477 ModuleDef *importedModule = getPrimaryInterface(importInfo.importName);
1478 const FileDef *importedFd = importedModule ? importedModule->getFileDef() : nullptr;
1479 AUTO_TRACE_ADD("module: addIncludeDependency {}->{}:{} fd={}",
1480 mod->qualifiedName(), importInfo.qualifiedName(), importInfo.line, fd?fd->absFilePath():"");
1481 fd->addIncludeDependency(importedFd,importInfo.qualifiedName(),IncludeKind::ImportModule);
1482 }
1483 }
1484 }
1485 }
1486 for (const auto &[fileName,importInfoList] : p->externalImports)
1487 {
1488 for (const auto &importInfo : importInfoList)
1489 {
1490 bool ambig = false;
1491 FileDef *fd = Doxygen::inputNameLinkedMap->findFileDef(fileName,ambig);
1492 AUTO_TRACE_ADD("externalImport name={} fd={}",fileName,(void*)fd);
1493 if (fd)
1494 {
1495 ModuleDef *mod = getPrimaryInterface(importInfo.importName);
1496 FileDef *importedFd = mod ? mod->getFileDef() : nullptr;
1497 fd->addIncludeDependency(importedFd,importInfo.importName,IncludeKind::ImportModule);
1498 if (importedFd)
1499 {
1501 }
1502 }
1503 }
1504 }
1505 for (const auto &headerInfo : p->headers)
1506 {
1507 bool ambig = false;
1508 FileDef *fd = Doxygen::inputNameLinkedMap->findFileDef(headerInfo.fileName,ambig);
1509 AUTO_TRACE_ADD("header name={} fd={}",headerInfo.fileName,(void*)fd);
1510 if (fd)
1511 {
1512 DString resolvedHeader = determineAbsoluteIncludeName(headerInfo.fileName,headerInfo.headerName);
1513 FileDef *importFd = Doxygen::inputNameLinkedMap->findFileDef(resolvedHeader,ambig);
1514 fd->addIncludeDependency(importFd, headerInfo.headerName,
1515 headerInfo.isSystem ? IncludeKind::ImportSystem : IncludeKind::ImportLocal);
1516 if (importFd)
1517 {
1518 importFd->addIncludedByDependency(fd,headerInfo.fileName,IncludeKind::ImportModule);
1519 }
1520 }
1521 }
1522}
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:97
virtual void addIncludeDependency(const FileDef *fd, const DString &incName, IncludeKind kind)=0
virtual DString absFilePath() const =0
virtual void addIncludedByDependency(const FileDef *fd, const DString &incName, IncludeKind kind)=0
FileDef * findFileDef(const DString &n, bool &ambig) const
Returns the file definition in fnMap that matches the file name n.
Definition filename.cpp:38
virtual FileDef * getFileDef() const =0
@ ImportLocal
Definition filedef.h:51
@ ImportModule
Definition filedef.h:52
@ ImportSystem
Definition filedef.h:50
DString determineAbsoluteIncludeName(const DString &curFile, const DString &incFileName)
Definition util.cpp:2929
DString stripFromPath(const DString &path)
Definition util.cpp:219

References FileDef::absFilePath(), FileDef::addIncludedByDependency(), FileDef::addIncludeDependency(), AUTO_TRACE, AUTO_TRACE_ADD, determineAbsoluteIncludeName(), FileDef::fileName(), FileNameLinkedMap::findFileDef(), ModuleDef::getFileDef(), getPrimaryInterface(), ImportLocal, ImportModule, ImportSystem, Doxygen::inputNameLinkedMap, p, Definition::qualifiedName(), and stripFromPath().

◆ resolvePartitions()

void ModuleManager::resolvePartitions ( )

Definition at line 1432 of file moduledef.cpp.

1433{
1434 AUTO_TRACE();
1435 for (auto &mod : p->moduleFileMap) // foreach module
1436 {
1437 if (mod->moduleType()==ModuleDef::Type::Interface && mod->partitionName().empty())
1438 { // that is a primary interface
1439 resolvePartitionsRecursively(mod.get(),mod.get());
1440 }
1441
1442 // copy exported imports to m_exportedModules
1443 for (const auto &[fileName,importInfoList] : mod->getImports())
1444 {
1445 for (const auto &importInfo : importInfoList)
1446 {
1447 if (importInfo.exported && mod->name()!=importInfo.importName)
1448 {
1449 toModuleDefImpl(mod)->addExportedModule(importInfo.importName,importInfo);
1450 }
1451 }
1452 }
1453
1454 // also link the ModuleDef and FileDef together
1455 bool ambig = false;
1456 FileDef *fd = Doxygen::inputNameLinkedMap->findFileDef(mod->getDefFileName(),ambig);
1457 if (fd)
1458 {
1459 fd->setModuleDef(mod.get());
1460 toModuleDefImpl(mod)->setFileDef(fd);
1461 }
1462 }
1463}
virtual void setModuleDef(ModuleDef *mod)=0
void setFileDef(FileDef *fd)
void addExportedModule(const DString &moduleName, const ImportInfo &info)
void resolvePartitionsRecursively(ModuleDef *intfMod, ModuleDef *mod)

References ModuleDefImpl::addExportedModule(), AUTO_TRACE, FileNameLinkedMap::findFileDef(), Doxygen::inputNameLinkedMap, ModuleDef::Interface, p, resolvePartitionsRecursively(), ModuleDefImpl::setFileDef(), FileDef::setModuleDef(), and toModuleDefImpl().

◆ resolvePartitionsRecursively()

void ModuleManager::resolvePartitionsRecursively ( ModuleDef * intfMod,
ModuleDef * mod )
private

Definition at line 1390 of file moduledef.cpp.

1391{
1392 AUTO_TRACE();
1393 for (auto &[partitionFileName,importInfoList] : mod->getImports()) // foreach import
1394 {
1395 for (auto &importInfo : importInfoList)
1396 {
1397 AUTO_TRACE_ADD("partitionFileName={} importName={} partitionName={}",
1398 partitionFileName,importInfo.importName,importInfo.partitionName);
1399 if (importInfo.importName==intfMod->name() && !importInfo.partitionName.empty() &&
1400 importInfo.exported) // that is an exported partition of this module
1401 {
1402 auto it = p->moduleNameMap.find(importInfo.importName.str());
1403 if (it != p->moduleNameMap.end())
1404 {
1405 for (auto importedMod : it->second)
1406 {
1407 if (importedMod->qualifiedName()==importInfo.importName+":"+importInfo.partitionName)
1408 {
1409 AUTO_TRACE_ADD("Interface module {} exports partition {}:{}",
1410 mod->name(),importedMod->name(),importedMod->partitionName());
1411 toModuleDefImpl(intfMod)->addPartition(toModuleDefImpl(importedMod));
1412 toModuleDefImpl(importedMod)->setPrimaryInterface(intfMod);
1413 for (const auto &[partitionFileName_,partitionImportInfoList] : importedMod->getImports())
1414 {
1415 for (const auto &partitionImportInfo : partitionImportInfoList)
1416 {
1417 if (partitionImportInfo.exported && intfMod->name()!=partitionImportInfo.importName)
1418 {
1419 toModuleDefImpl(intfMod)->addExportedModule(partitionImportInfo.importName,partitionImportInfo);
1420 }
1421 }
1422 }
1423 resolvePartitionsRecursively(intfMod,importedMod);
1424 }
1425 }
1426 }
1427 }
1428 }
1429 }
1430}
virtual const DString & name() const =0
virtual const ImportInfoMap & getImports() const =0
void addPartition(ModuleDefImpl *mod)
void setPrimaryInterface(const ModuleDef *mod)

References ModuleDefImpl::addExportedModule(), ModuleDefImpl::addPartition(), AUTO_TRACE, AUTO_TRACE_ADD, DString::empty(), ModuleDef::getImports(), Definition::name(), p, resolvePartitionsRecursively(), ModuleDefImpl::setPrimaryInterface(), and toModuleDefImpl().

Referenced by resolvePartitions(), and resolvePartitionsRecursively().

◆ sortMemberLists()

void ModuleManager::sortMemberLists ( )

Definition at line 1697 of file moduledef.cpp.

1698{
1699 for (auto &mod : p->moduleFileMap) // foreach module
1700 {
1701 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->sortMemberLists();
1702 }
1703}
void sortMemberLists()

References p, ModuleDefImpl::sortMemberLists(), and toModuleDefImpl().

Referenced by sortMemberLists().

◆ writeDocumentation()

void ModuleManager::writeDocumentation ( OutputList & ol)

Definition at line 1571 of file moduledef.cpp.

1572{
1573 for (auto &mod : p->moduleFileMap) // foreach module
1574 {
1575 if (mod->isPrimaryInterface())
1576 {
1577 mod->writeDocumentation(ol);
1578 }
1579 }
1580}

References p.

Referenced by generateOutput().

Member Data Documentation

◆ p


The documentation for this class was generated from the following files: