Doxygen
Loading...
Searching...
No Matches
moduledef.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2023 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16#include "moduledef.h"
17#include "definitionimpl.h"
18#include "entry.h"
19#include "memberdef.h"
20#include "classlist.h"
21#include "namespacedef.h"
22#include "conceptdef.h"
23#include "config.h"
24#include "outputlist.h"
25#include "language.h"
26#include "util.h"
27#include "groupdef.h"
28#include "message.h"
29#include "membergroup.h"
30#include "classdef.h"
31#include "textstream.h"
32#include "trace.h"
33
34class ModuleDefImpl;
35
37{
38 HeaderInfo(const QCString &fn,const QCString &name,bool sys)
39 : fileName(fn), headerName(name), isSystem(sys) {}
40 QCString fileName; // file containing the import
41 QCString headerName; // name of the imported header
42 bool isSystem; // <...> => true, "..." => false
43};
44
45using HeaderInfoVector = std::vector<HeaderInfo>;
46
47
48class ModuleDefImpl : public DefinitionMixin<ModuleDef>
49{
50 public:
51 ModuleDefImpl(const QCString &fileName,int startLine,int startColom,
52 const QCString &name, Type type, const QCString &partitionName)
53 : DefinitionMixin<ModuleDef>(fileName,startLine,startColom,name,nullptr,nullptr,true),
55
56 // --- Definition
57 DefType definitionType() const override { return TypeModule; }
59 QCString displayName(bool=TRUE) const override { return name(); }
60 QCString getOutputFileBase() const override;
61 QCString anchor() const override { return ""; }
62 bool isLinkableInProject() const override {
63 if (m_primaryInterface) return m_primaryInterface->isLinkableInProject();
64 else return isLinkable() && !isHidden() && !isReference(); }
65 bool isLinkable() const override {
66 if (m_primaryInterface) return m_primaryInterface->isLinkable();
67 else return hasDocumentation(); }
68 QCString qualifiedName() const override;
69 void writeSummaryLinks(OutputList &ol) const override;
70
71 // --- ModuleDef
72 Type moduleType() const override { return m_type; }
73 QCString partitionName() const override { return m_partitionName; }
74 void writeDocumentation(OutputList &ol) override;
75 bool isPrimaryInterface() const override { return m_type==Type::Interface && m_partitionName.isEmpty(); }
76 MemberList *getMemberList(MemberListType lt) const override;
77 const MemberLists &getMemberLists() const override { return m_memberLists; }
78 const MemberGroupList &getMemberGroups() const override { return m_memberGroups; }
79 const ClassLinkedRefMap &getClasses() const override { return m_classes; }
80 const ConceptLinkedRefMap &getConcepts() const override { return m_concepts; }
81 int countVisibleMembers() const override;
82 FileDef *getFileDef() const override { return m_fileDef; }
83 const ImportInfoMap &getImports() const override { return m_imports; }
84 const ImportInfoMap &getExports() const override { return m_exportedModules; }
85 const ModuleMap &partitions() const override { return m_partitions; }
86 void writeTagFile(TextStream &t) const override;
87 FileList getUsedFiles() const override;
88
89 void writeExports(OutputList &ol,const QCString &title);
90 void writeClassDeclarations(OutputList &ol,const QCString &title);
91 void writeConcepts(OutputList &ol,const QCString &title);
92 void writeFiles(OutputList &ol,const QCString &title);
97 void writeDetailedDescription(OutputList &ol,const QCString &title);
103 void writeDeclarationLink(OutputList &ol,bool &found,const QCString &header,bool localNames) const;
104
105 void addHeader(int line,const QCString &headerName,bool isSystem);
106 void addImport(int line,const QCString &moduleName,const QCString &partitionName,bool isExported);
107 void addClassToModule(const Entry *root,ClassDef *cd);
108 void addConceptToModule(const Entry *root,ConceptDef *cd);
109 void addMemberToModule(const Entry *root,MemberDef *md);
110 void addPartition(ModuleDefImpl *mod);
112 void setPrimaryInterface(const ModuleDef *mod);
113 void setFileDef(FileDef *fd);
115 void addExportedModule(const QCString &moduleName,const ImportInfo &info);
116 void addListReferences();
120 void sortMemberLists();
121
122 //ModuleMap &partitions() { return m_partitions; }
123 void mergeSymbolsFrom(ModuleDefImpl *other);
124 bool hasDetailedDescription() const;
125 void countMembers();
126
127 private:
139 FileDef *m_fileDef = nullptr; // file holding this module
140};
141
143{
144 return convertNameToFile("module_" + name());
145}
146
148{
149 QCString result=name();
150 if (!m_partitionName.isEmpty())
151 {
152 result+=":"+m_partitionName;
153 }
154 return result;
155}
156
158{
159 std::string qName = mod->qualifiedName().str();
160 if (m_partitions.find(qName)==m_partitions.end())
161 {
162 m_partitions.emplace(qName,mod);
163 }
164}
165
167{
168 if (std::find(m_contributing.begin(),m_contributing.end(),mod)==m_contributing.end())
169 {
170 m_contributing.push_back(mod);
171 }
172}
173
178
180{
181 m_fileDef = fd;
182}
183
184void ModuleDefImpl::addHeader(int line,const QCString &headerName,bool isSystem)
185{
186 AUTO_TRACE("name={}:line={},header={},isSystem={}",name(),line,headerName,isSystem);
187}
188
189void ModuleDefImpl::addImport(int line,const QCString &moduleName,const QCString &partitionName,bool isExported)
190{
191 AUTO_TRACE("name={}:line={},module={},partition={}",name(),line,moduleName,partitionName);
192 m_imports[getDefFileName().str()+":"+std::to_string(line)].push_back(ImportInfo(this,moduleName,line,partitionName,isExported));
193}
194
195void ModuleDefImpl::addExportedModule(const QCString &moduleName,const ImportInfo &info)
196{
197 AUTO_TRACE("name={}:moduleName={},import={}",name(),moduleName,info.importName);
198 m_exportedModules[moduleName.str()].push_back(info);
199}
200
202{
203 QCString className = cd->qualifiedName();
204 AUTO_TRACE("{}:{} class {} of module {} exported={}",
205 root->fileName,root->startLine, className, name(), root->exported);
206 bool isExported = m_classes.find(className)!=nullptr;
207 if (root->exported && !isExported)
208 {
209 m_classes.add(className,cd);
210 }
211 auto cdm = toClassDefMutable(cd);
212 if (cdm && root->exported && !cd->isExported())
213 {
214 cdm->setExported(true);
215 }
216}
217
219{
220 QCString conceptName = cd->qualifiedName();
221 AUTO_TRACE("{}:{} concept {} of module {} exported={}",
222 root->fileName,root->startLine,
223 cd->qualifiedName(),name(),
224 root->exported);
225 bool isExported = m_classes.find(conceptName)!=nullptr;
226 if (root->exported && !isExported)
227 {
228 m_concepts.add(conceptName,cd);
229 }
230 auto cdm = toConceptDefMutable(cd);
231 if (cdm && root->exported && !cd->isExported())
232 {
233 cdm->setExported(true);
234 }
235}
236
238{
239 for (auto &ml : m_memberLists)
240 {
241 if (ml->listType()==lt)
242 {
243 return ml.get();
244 }
245 }
246 return nullptr;
247}
248
250{
251 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
252 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
254 ml->setNeedsSorting(
255 (ml->listType().isDeclaration() && sortBriefDocs) ||
256 (ml->listType().isDocumentation() && sortMemberDocs));
257 ml->push_back(md);
258 if (ml->listType().isDeclaration())
259 {
261 if (mdm)
262 {
263 mdm->setSectionList(this,ml.get());
264 }
265 }
266}
267
269{
270 AUTO_TRACE("{}:{} member {} of module {} exported={}",
271 qPrint(root->fileName),root->startLine,
273 root->exported);
274 MemberList *allMemberList = getMemberList(MemberListType::AllMembersList());
275 if (allMemberList==nullptr)
276 {
277 m_memberLists.emplace_back(std::make_unique<MemberList>(MemberListType::AllMembersList(),MemberListContainer::Module));
278 allMemberList = m_memberLists.back().get();
279 }
280 if (allMemberList->contains(md))
281 {
282 return;
283 }
284 allMemberList->push_back(md);
285 switch (md->memberType())
286 {
288 addMemberToList(MemberListType::DecVarMembers(),md);
289 break;
291 addMemberToList(MemberListType::DecFuncMembers(),md);
292 break;
294 addMemberToList(MemberListType::DecTypedefMembers(),md);
295 break;
297 addMemberToList(MemberListType::DecEnumMembers(),md);
298 break;
299 default:
300 break;
301 }
302 auto mdm = toMemberDefMutable(md);
303 if (mdm && root->exported && !md->isExported())
304 {
305 mdm->setExported(true);
306 }
307}
308
310{
311 AUTO_TRACE("{} merging symbols of {} ({}:{})",
312 name(),other->qualifiedName(),other->getDefFileName(),other->getDefLine());
313 for (const auto &cd : other->getClasses())
314 {
315 m_classes.add(cd->qualifiedName(),cd);
316 }
317 for (const auto &cd : other->getConcepts())
318 {
319 m_concepts.add(cd->qualifiedName(),cd);
320 }
321 auto mergeMemberList = [this,other](MemberListType lt)
322 {
323 const auto srcMl = other->getMemberList(lt);
324 if (srcMl)
325 {
326 auto &dstMl = m_memberLists.get(lt,srcMl->container());
327 for (const auto &md : *srcMl)
328 {
329 dstMl->push_back(md);
330 }
331 }
332 };
333 mergeMemberList(MemberListType::DecVarMembers());
334 mergeMemberList(MemberListType::DecFuncMembers());
335 mergeMemberList(MemberListType::DecTypedefMembers());
336 mergeMemberList(MemberListType::DecEnumMembers());
337}
338
340{
341 if (isReference()) return;
343 AUTO_TRACE("%s file=%s",name(),getDefFileName());
344 SrcLangExt lang = getLanguage();
345 QCString pageTitle;
346 if (Config_getBool(HIDE_COMPOUND_REFERENCE))
347 {
348 pageTitle = displayName();
349 }
350 else
351 {
352 pageTitle = theTranslator->trModuleReference(displayName());
353 }
355
356 // ---- title part
360
363 ol.parseText(pageTitle);
365
366 addGroupListToTitle(ol,this);
367
370 ol.endTitleHead(getOutputFileBase(),pageTitle);
372
376 ol.writeString(" - ");
377 ol.parseText(pageTitle);
379
380 ol.endHeaderSection();
381 ol.startContents();
382
383 //---------------------------------------- start flexible part -------------------------------
384 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Module))
385 {
386 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
387 switch (lde->kind())
388 {
389 case LayoutDocEntry::BriefDesc:
391 break;
392 case LayoutDocEntry::MemberDeclStart:
394 break;
395 case LayoutDocEntry::ModuleClasses:
396 if (ls) writeClassDeclarations(ol,ls->title(lang));
397 break;
398 case LayoutDocEntry::ModuleConcepts:
399 if (ls) writeConcepts(ol,ls->title(lang));
400 break;
401 case LayoutDocEntry::ModuleExports:
402 if (ls) writeExports(ol,ls->title(lang));
403 break;
404 case LayoutDocEntry::ModuleUsedFiles:
405 if (ls) writeFiles(ol,ls->title(lang));
406 break;
407 case LayoutDocEntry::MemberGroups:
409 break;
410 case LayoutDocEntry::MemberDecl:
411 {
412 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
413 if (lmd) writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
414 }
415 break;
416 case LayoutDocEntry::MemberDeclEnd:
418 break;
419 case LayoutDocEntry::DetailedDesc:
420 if (ls) writeDetailedDescription(ol,ls->title(lang));
421 break;
422 case LayoutDocEntry::MemberDefStart:
424 break;
425 case LayoutDocEntry::MemberDef:
426 {
427 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
428 if (lmd) writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
429 }
430 break;
431 case LayoutDocEntry::MemberDefEnd:
433 break;
434 case LayoutDocEntry::AuthorSection:
436 break;
437 case LayoutDocEntry::ClassIncludes:
438 case LayoutDocEntry::ClassInheritanceGraph:
439 case LayoutDocEntry::ClassNestedClasses:
440 case LayoutDocEntry::ClassCollaborationGraph:
441 case LayoutDocEntry::ClassAllMembersLink:
442 case LayoutDocEntry::ClassUsedFiles:
443 case LayoutDocEntry::ClassInlineClasses:
444 case LayoutDocEntry::FileClasses:
445 case LayoutDocEntry::FileConcepts:
446 case LayoutDocEntry::FileInterfaces:
447 case LayoutDocEntry::FileStructs:
448 case LayoutDocEntry::FileExceptions:
449 case LayoutDocEntry::FileNamespaces:
450 case LayoutDocEntry::FileConstantGroups:
451 case LayoutDocEntry::FileIncludes:
452 case LayoutDocEntry::FileIncludeGraph:
453 case LayoutDocEntry::FileIncludedByGraph:
454 case LayoutDocEntry::FileInlineClasses:
455 case LayoutDocEntry::FileSourceLink:
456 case LayoutDocEntry::NamespaceNestedNamespaces:
457 case LayoutDocEntry::NamespaceNestedConstantGroups:
458 case LayoutDocEntry::NamespaceClasses:
459 case LayoutDocEntry::NamespaceConcepts:
460 case LayoutDocEntry::NamespaceInterfaces:
461 case LayoutDocEntry::NamespaceStructs:
462 case LayoutDocEntry::NamespaceExceptions:
463 case LayoutDocEntry::NamespaceInlineClasses:
464 case LayoutDocEntry::ConceptDefinition:
465 case LayoutDocEntry::GroupClasses:
466 case LayoutDocEntry::GroupConcepts:
467 case LayoutDocEntry::GroupModules:
468 case LayoutDocEntry::GroupInlineClasses:
469 case LayoutDocEntry::GroupNamespaces:
470 case LayoutDocEntry::GroupDirs:
471 case LayoutDocEntry::GroupNestedGroups:
472 case LayoutDocEntry::GroupFiles:
473 case LayoutDocEntry::GroupGraph:
474 case LayoutDocEntry::GroupPageDocs:
475 case LayoutDocEntry::DirSubDirs:
476 case LayoutDocEntry::DirFiles:
477 case LayoutDocEntry::DirGraph:
478 err("Internal inconsistency: member '{}' should not be part of "
479 "LayoutDocManager::Module entry list\n",lde->entryToString());
480 break;
481 }
482 }
483
484 //---------------------------------------- end flexible part -------------------------------
485 endFile(ol);
486
488}
489
491{
492 m_classes.writeDeclaration(ol,nullptr,title,FALSE);
493}
494
496{
497 m_concepts.writeDeclaration(ol,title,FALSE);
498}
499
504
509
511{
512 if (Config_getBool(SEPARATE_MEMBER_PAGES))
513 {
516 }
517}
518
520{
521 if (Config_getBool(SEPARATE_MEMBER_PAGES))
522 {
525 }
526}
527
529{
531 {
534 ol.writeRuler();
538 ol.writeAnchor(QCString(),"details");
540 ol.startGroupHeader();
541 ol.parseText(title);
542 ol.endGroupHeader();
543
544 ol.startTextBlock();
545 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
546 {
548 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
549 }
550 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
551 !documentation().isEmpty())
552 {
556 ol.enableAll();
559 ol.writeString("\n\n");
561 }
562 if (!documentation().isEmpty())
563 {
564 ol.generateDoc(docFile(),docLine(),this,nullptr,documentation()+"\n",TRUE,FALSE,
565 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
566 }
567 ol.endTextBlock();
568 }
569}
570
572{
574 {
575 auto parser { createDocParser() };
576 auto ast { validatingParseDoc(*parser.get(),
577 briefFile(),briefLine(),this,nullptr,
579 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT)) };
580 if (!ast->isEmpty())
581 {
582 ol.startParagraph();
585 ol.writeString(" - ");
587 ol.writeDoc(ast.get(),this,nullptr);
590 ol.writeString(" \n");
592
594 {
596 ol.startTextLink(QCString(),"details");
597 ol.parseText(theTranslator->trMore());
598 ol.endTextLink();
599 }
601 ol.endParagraph();
602 }
603 }
604 ol.writeSynopsis();
605}
606
608{
609 for (const auto &mg : m_memberGroups)
610 {
611 mg->writeDeclarations(ol,nullptr,nullptr,nullptr,nullptr,this);
612 }
613}
614
616{
617 MemberList * ml = getMemberList(lt);
618 if (ml) ml->writeDeclarations(ol,nullptr,nullptr,nullptr,nullptr,this,title,QCString());
619}
620
622{
623 MemberList * ml = getMemberList(lt);
624 if (ml) ml->writeDocumentation(ol,name(),this,title);
625}
626
628{
629 // write Author section (Man only)
632 ol.startGroupHeader();
633 ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
634 ol.endGroupHeader();
635 ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString(PROJECT_NAME)));
637}
638
640{
641 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
642 return (!briefDescription().isEmpty() && repeatBrief) || !documentation().isEmpty();
643}
644
646{
647 for (auto &ml : m_memberLists)
648 {
649 ml->countDecMembers();
650 ml->countDocMembers();
651 }
652 for (const auto &mg : m_memberGroups)
653 {
654 mg->countDecMembers();
655 mg->countDocMembers();
656 }
657}
658
660{
661 const RefItemVector &xrefItems = xrefListItems();
662 addRefItem(xrefItems,
664 getLanguage()==SrcLangExt::Fortran ?
665 theTranslator->trModule(TRUE,TRUE) :
666 theTranslator->trNamespace(TRUE,TRUE),
668 QCString(),
669 this
670 );
671 for (const auto &mg : m_memberGroups)
672 {
673 mg->addListReferences(this);
674 }
675 for (auto &ml : m_memberLists)
676 {
677 if (ml->listType().isDocumentation())
678 {
679 ml->addListReferences(this);
680 }
681 }
682}
683
685{
686 for (auto &ml : m_memberLists)
687 {
688 if (ml->listType().isDeclaration())
689 {
691 }
692 }
693
694 // add members inside sections to their groups
695 for (const auto &mg : m_memberGroups)
696 {
697 if (mg->allMembersInSameSection() && Config_getBool(SUBGROUPING))
698 {
699 //printf("----> addToDeclarationSection(%s)\n",qPrint(mg->header()));
700 mg->addToDeclarationSection();
701 }
702 }
703}
704
706{
707 for (const auto &mg : m_memberGroups)
708 {
709 mg->distributeMemberGroupDocumentation();
710 }
711}
712
714{
718 for (const auto &mg : m_memberGroups)
719 {
720 mg->findSectionsInDocumentation(this);
721 }
722 for (auto &ml : m_memberLists)
723 {
724 if (ml->listType().isDeclaration())
725 {
726 ml->findSectionsInDocumentation(this);
727 }
728 }
729}
730
732{
733 for (auto &ml : m_memberLists)
734 {
735 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
736 }
737
738 if (Config_getBool(SORT_BRIEF_DOCS))
739 {
740 auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
741 {
742 return Config_getBool(SORT_BY_SCOPE_NAME) ?
743 qstricmp_sort(c1->name(), c2->name())<0 :
744 qstricmp_sort(c1->className(), c2->className())<0;
745 };
746 std::stable_sort(m_classes.begin(), m_classes.end(), classComp);
747
748 auto conceptComp = [](const ConceptLinkedRefMap::Ptr &c1,const ConceptLinkedRefMap::Ptr &c2)
749 {
750 return Config_getBool(SORT_BY_SCOPE_NAME) ?
751 qstricmp_sort(c1->qualifiedName(), c2->qualifiedName())<0 :
752 qstricmp_sort(c1->name(), c2->name())<0;
753 };
754 std::stable_sort(m_concepts.begin(), m_concepts.end(), conceptComp);
755 }
756
757 static auto contrComp = [](const ModuleDef *m1, const ModuleDef *m2)
758 {
759 FileDef *f1 = m1->getFileDef();
760 FileDef *f2 = m2->getFileDef();
761 QCString fn1 = f1 ? f1->name() : m1->name();
762 QCString fn2 = f2 ? f2->name() : m2->name();
763 static auto typeRank = [](const ModuleDef *m) -> int
764 {
765 if (m->moduleType()==ModuleDef::Type::Interface)
766 {
767 if (m->partitionName().isEmpty()) return 0; // primary interface unit
768 return 1; // partition interface unit
769 }
770 else
771 {
772 if (!m->partitionName().isEmpty()) return 2; // partition implementation unit
773 return 3; // implementation unit
774 }
775 };
776 auto tr1 = typeRank(m1);
777 auto tr2 = typeRank(m2);
778 int diff = qstricmp_sort(fn1,fn2);
779 return tr1<tr2 || (tr1==tr2 && diff<0);
780 };
781
782 std::stable_sort(m_contributing.begin(), m_contributing.end(), contrComp);
783}
784
786{
789 bool first=TRUE;
790 SrcLangExt lang=getLanguage();
791 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Module))
792 {
793 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
794 if (lde->kind()==LayoutDocEntry::ModuleClasses && m_classes.declVisible() && ls)
795 {
796 QCString label = "classes";
797 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
798 first=FALSE;
799 }
800 else if (lde->kind()==LayoutDocEntry::ModuleConcepts && m_concepts.declVisible() && ls)
801 {
802 QCString label = "concepts";
803 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
804 first=FALSE;
805 }
806 else if (lde->kind()==LayoutDocEntry::ModuleUsedFiles && ls)
807 {
808 QCString label = "files";
809 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
810 first=FALSE;
811 }
812 else if (lde->kind()==LayoutDocEntry::MemberDecl)
813 {
814 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
815 if (lmd)
816 {
817 MemberList * ml = getMemberList(lmd->type);
818 if (ml && ml->declVisible())
819 {
820 ol.writeSummaryLink(QCString(),ml->listType().toLabel(),lmd->title(lang),first);
821 first=FALSE;
822 }
823 }
824 }
825 }
826 if (!first)
827 {
828 ol.writeString(" </div>\n");
829 }
831}
832
833void ModuleDefImpl::writeDeclarationLink(OutputList &ol,bool &found,const QCString &header,bool localNames) const
834{
835 if (isLinkable())
836 {
837 if (!found) // first module
838 {
839 ol.startMemberHeader("modules");
840 if (!header.isEmpty())
841 {
842 ol.parseText(header);
843 }
844 else
845 {
846 theTranslator->trModule(true,false);
847 }
848 ol.endMemberHeader();
849 ol.startMemberList();
850 found=TRUE;
851 }
854 ol.writeString("module ");
855 QCString cname = displayName(!localNames);
857 if (isLinkable())
858 {
861 anchor(),
862 cname
863 );
864 }
865 else
866 {
867 ol.startBold();
868 ol.docify(cname);
869 ol.endBold();
870 }
872 // add the brief description if available
873 if (!briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
874 {
875 auto parser { createDocParser() };
876 auto ast { validatingParseDoc(
877 *parser.get(),briefFile(),briefLine(),this,nullptr,
879 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT)) };
880 if (!ast->isEmpty())
881 {
883 ol.writeDoc(ast.get(),this,nullptr);
885 }
886 }
888 }
889}
890
891
893{
894 AUTO_TRACE("name={} count={}",name(),m_exportedModules.size());
895 if (!m_exportedModules.empty())
896 {
897 ol.startMemberHeader("exports");
898 ol.parseText(title);
899 ol.endMemberHeader();
900 ol.startMemberList();
901 for (const auto &[moduleName,importInfoList] : m_exportedModules)
902 {
903 for (const auto &importInfo : importInfoList)
904 {
905 ModuleDef *mod = ModuleManager::instance().getPrimaryInterface(importInfo.importName);
908 ol.docify(theTranslator->trModule(FALSE,TRUE)+" ");
910 if (mod && mod->isLinkable())
911 {
913 }
914 else
915 {
916 ol.startBold();
917 ol.docify(importInfo.importName);
918 ol.endBold();
919 }
921 if (mod && !mod->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
922 {
924 ol.generateDoc(briefFile(),briefLine(),mod,nullptr,mod->briefDescription(),FALSE,FALSE,
925 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
927 }
929 }
930 }
931 ol.endMemberList();
932 }
933}
934
936{
937 AUTO_TRACE("{} count={}",name(),m_contributing.size());
938 if (!m_contributing.empty())
939 {
940 ol.startMemberHeader("files");
941 ol.parseText(title);
942 ol.endMemberHeader();
943 ol.startMemberList();
944 for (const auto &mod : m_contributing)
945 {
946 FileDef *fd = mod->getFileDef();
947 if (fd)
948 {
951 ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
953 QCString path=fd->getPath();
954 if (Config_getBool(FULL_PATH_NAMES))
955 {
956 ol.docify(stripFromPath(path));
957 }
958 if (fd->isLinkable())
959 {
961 }
962 else
963 {
964 ol.startBold();
965 ol.docify(fd->displayName());
966 ol.endBold();
967 }
969 if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
970 {
973 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
975 }
977 }
978 }
979 ol.endMemberList();
980 }
981}
982
984{
985 FileList result;
986 for (const auto &mod : m_contributing)
987 {
988 FileDef *fd = mod->getFileDef();
989 if (fd) result.push_back(fd);
990 }
991 return result;
992}
993
995{
996 int count=0;
997 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Module))
998 {
999 if (lde->kind()==LayoutDocEntry::MemberDecl)
1000 {
1001 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1002 if (lmd)
1003 {
1004 MemberList *ml = getMemberList(lmd->type);
1005 if (ml)
1006 {
1007 for (const auto &md : *ml)
1008 {
1009 if (md->visibleInIndex())
1010 {
1011 count++;
1012 }
1013 }
1014 }
1015 }
1016 }
1017 else if (lde->kind()==LayoutDocEntry::ModuleClasses)
1018 {
1019 for (const auto &cd : getClasses())
1020 {
1021 if (cd->isLinkableInProject())
1022 {
1023 count++;
1024 }
1025 }
1026 }
1027 else if (lde->kind()==LayoutDocEntry::ModuleConcepts)
1028 {
1029 for (const auto &cd : getConcepts())
1030 {
1031 if (cd->isLinkableInProject())
1032 {
1033 count++;
1034 }
1035 }
1036 }
1037 }
1038 return count;
1039}
1040
1042{
1043 if (!isPrimaryInterface() || !isLinkableInProject()) return;
1044 tagFile << " <compound kind=\"module\">\n";
1045 tagFile << " <name>" << convertToXML(name()) << "</name>\n";
1046 const FileDef *fd = getFileDef();
1047 QCString fn = fd ? fd->getOutputFileBase() : getOutputFileBase();
1049 tagFile << " <filename>" << convertToXML(fn) << "</filename>\n";
1050#if 0 // at the moment we do not export the members of a module to a tag file.
1051 // We let the project using a tag file directly link to the implementation of the
1052 // symbols (which have the same scope).
1053 //
1054 // When we support linking to a module's interface instead we need to
1055 // export the module's members as well. Then we probably need a way to
1056 // disambiguate/prioritize a link to a module over a link to the implementation,
1057 // for instance by hiding non-exported symbols from the tag file.
1058 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1059 {
1060 switch (lde->kind())
1061 {
1062 case LayoutDocEntry::ModuleExports:
1063 {
1064 for (const auto &[modName,importInfo] : m_exportedModules)
1065 {
1066 tagFile << " <export>" << convertToXML(importInfo.importName) << "</export>\n";
1067 }
1068 }
1069 break;
1070 case LayoutDocEntry::ModuleClasses:
1071 {
1072 for (const auto &cd : m_classes)
1073 {
1074 if (cd->isLinkableInProject())
1075 {
1076 tagFile << " <class kind=\"" << cd->compoundTypeString()
1077 << "\">" << convertToXML(cd->name()) << "</class>\n";
1078 }
1079 }
1080 }
1081 break;
1082 case LayoutDocEntry::ModuleConcepts:
1083 {
1084 for (const auto &cd : m_concepts)
1085 {
1086 if (cd->isLinkableInProject())
1087 {
1088 tagFile << " <concept>" << convertToXML(cd->name())
1089 << "</concept>\n";
1090 }
1091 }
1092 }
1093 break;
1094 case LayoutDocEntry::ModuleUsedFiles:
1095 {
1096 for (const auto &usedFd : getUsedFiles())
1097 {
1098 if (usedFd->isLinkableInProject())
1099 {
1100 tagFile << " <file>" << convertToXML(usedFd->name()) << "</file>\n";
1101 }
1102 }
1103 }
1104 break;
1105 case LayoutDocEntry::MemberDecl:
1106 {
1107 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1108 if (lmd && lmd->visible())
1109 {
1110 MemberList * ml = getMemberList(lmd->type);
1111 if (ml)
1112 {
1113 ml->writeTagFile(tagFile,true);
1114 }
1115 }
1116 }
1117 break;
1118 default:
1119 break;
1120 }
1121 }
1122#endif
1123 QCString idStr = id();
1124 if (!idStr.isEmpty())
1125 {
1126 tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>\n";
1127 }
1128 writeDocAnchorsToTagFile(tagFile);
1129 tagFile << " </compound>\n";
1130}
1131
1132//------------------------------------------------------------------------------------------------------------
1133
1135{
1136 if (d==nullptr) return nullptr;
1137 return (typeid(*d)==typeid(ModuleDefImpl)) ? static_cast<ModuleDef*>(d) : nullptr;
1138}
1139
1141{
1142 if (d==nullptr) return nullptr;
1143 return (typeid(*d)==typeid(ModuleDefImpl)) ? static_cast<const ModuleDef*>(d) : nullptr;
1144}
1145
1147{ return static_cast<ModuleDefImpl*>(m); }
1148
1149//static inline const ModuleDefImpl *toModuleDefImpl(const ModuleDef *m)
1150//{ return static_cast<const ModuleDefImpl*>(m); }
1151
1152static inline ModuleDefImpl *toModuleDefImpl(const std::unique_ptr<ModuleDef> &m)
1153{ return static_cast<ModuleDefImpl*>(m.get()); }
1154
1155//------------------------------------------------------------------------------------
1156
1158{
1159 bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
1160 for (const auto &mod : *this)
1161 {
1162 bool isLink = mod->isLinkable();
1163 if (isLink || !hideUndocClasses)
1164 {
1165 return true;
1166 }
1167 }
1168 return false;
1169}
1170
1171void ModuleLinkedRefMap::writeDeclaration(OutputList &ol,const QCString &header,bool localNames) const
1172{
1173 bool found=FALSE;
1174 for (const auto &mod : *this)
1175 {
1176 toModuleDefImpl(mod)->writeDeclarationLink(ol,found,header,localNames);
1177 }
1178 if (found) ol.endMemberList();
1179}
1180
1181//------------------------------------------------------------------------------------------------------------
1182
1184{
1185 ModuleLinkedMap moduleFileMap; // file->module mapping
1186 std::unordered_map<std::string,ModuleList> moduleNameMap; // name->module mapping
1189 std::mutex mutex;
1190};
1191
1193{
1194 static ModuleManager m;
1195 return m;
1196}
1197
1199{
1200}
1201
1202void ModuleManager::createModuleDef(const QCString &fileName,int line,int column,bool exported,
1203 const QCString &moduleName,const QCString &partitionName)
1204{
1205 AUTO_TRACE("{}:{}: Found module name='{}' partition='{}' exported='{}'",
1206 fileName,line,moduleName,partitionName,exported);
1207 std::lock_guard lock(p->mutex);
1209 std::unique_ptr<ModuleDef> modDef = std::make_unique<ModuleDefImpl>(fileName,line,column,moduleName,mt,partitionName);
1210 auto mod = p->moduleFileMap.add(fileName,std::move(modDef));
1211 auto it = p->moduleNameMap.find(moduleName.str());
1212 if (it == p->moduleNameMap.end())
1213 {
1214 ModuleList ml;
1215 ml.push_back(mod);
1216 p->moduleNameMap.emplace(moduleName.str(),ml);
1217 }
1218 else
1219 {
1220 it->second.push_back(mod);
1221 }
1222}
1223
1225{
1226 std::lock_guard lock(p->mutex);
1227 p->headers.clear();
1228 p->externalImports.clear();
1229 p->moduleNameMap.clear();
1230 p->moduleFileMap.clear();
1231}
1232
1233void ModuleManager::addHeader(const QCString &moduleFile,int line,const QCString &headerName,bool isSystem)
1234{
1235 AUTO_TRACE("{}:{} headerName={} isSystem={}",moduleFile,line,headerName,isSystem);
1236 std::lock_guard lock(p->mutex);
1237 auto mod = p->moduleFileMap.find(moduleFile);
1238 if (mod)
1239 {
1240 toModuleDefImpl(mod)->addHeader(line,headerName,isSystem);
1241 }
1242 else
1243 {
1244 AUTO_TRACE_ADD("imported header '{}' found in file '{}' that is not a module",headerName,moduleFile);
1245 }
1246 p->headers.emplace_back(moduleFile,headerName,isSystem);
1247}
1248
1249void ModuleManager::addImport(const QCString &moduleFile,int line,const QCString &importName,
1250 bool isExported,const QCString &partitionName)
1251{
1252 AUTO_TRACE("{}:{} importName={},isExported={},partitionName={}",
1253 moduleFile,line,importName,isExported,partitionName);
1254 std::lock_guard lock(p->mutex);
1255 auto mod = p->moduleFileMap.find(moduleFile);
1256 if (mod) // import inside a module
1257 {
1258 AUTO_TRACE_ADD("in module");
1259 toModuleDefImpl(mod)->addImport(line,importName.isEmpty()?mod->name():importName,partitionName,isExported);
1260 }
1261 else // import outside of a module
1262 {
1263 AUTO_TRACE_ADD("outside module");
1264 p->externalImports[moduleFile.str()].emplace_back(nullptr,importName,line,partitionName);
1265 }
1266}
1267
1269{
1270 std::lock_guard lock(p->mutex);
1271 auto mod = p->moduleFileMap.find(root->fileName);
1272 if (mod)
1273 {
1274 toModuleDefImpl(mod)->addClassToModule(root,cd);
1275 auto cdm = toClassDefMutable(cd);
1276 if (cdm) cdm->setModuleDef(mod);
1277 }
1278}
1279
1281{
1282 std::lock_guard lock(p->mutex);
1283 auto mod = p->moduleFileMap.find(root->fileName);
1284 if (mod)
1285 {
1286 toModuleDefImpl(mod)->addConceptToModule(root,cd);
1287 auto cdm = toConceptDefMutable(cd);
1288 if (cdm) cdm->setModuleDef(mod);
1289 }
1290}
1291
1293{
1294 std::lock_guard lock(p->mutex);
1295 auto mod = p->moduleFileMap.find(root->fileName);
1296 if (mod && root->exported)
1297 {
1298 toModuleDefImpl(mod)->addMemberToModule(root,md);
1299 auto mdm = toMemberDefMutable(md);
1300 if (mdm) mdm->setModuleDef(mod);
1301 }
1302}
1303
1304void ModuleManager::addTagInfo(const QCString &fileName,const QCString &tagFile,const QCString &clangId)
1305{
1306 std::lock_guard lock(p->mutex);
1307 auto mod = p->moduleFileMap.find(fileName);
1308 if (mod)
1309 {
1310 ModuleDefImpl *modi = toModuleDefImpl(mod);
1311 modi->setReference(tagFile);
1312 modi->setId(clangId);
1313 }
1314}
1315
1317{
1318 AUTO_TRACE();
1319 for (auto &[partitionFileName,importInfoList] : mod->getImports()) // foreach import
1320 {
1321 for (auto &importInfo : importInfoList)
1322 {
1323 AUTO_TRACE_ADD("partitionFileName={} importName={} partitionName={}",
1324 partitionFileName,importInfo.importName,importInfo.partitionName);
1325 if (importInfo.importName==intfMod->name() && !importInfo.partitionName.isEmpty() &&
1326 importInfo.exported) // that is an exported partition of this module
1327 {
1328 auto it = p->moduleNameMap.find(importInfo.importName.str());
1329 if (it != p->moduleNameMap.end())
1330 {
1331 for (auto importedMod : it->second)
1332 {
1333 if (importedMod->qualifiedName()==importInfo.importName+":"+importInfo.partitionName)
1334 {
1335 AUTO_TRACE_ADD("Interface module {} exports partition {}:{}",
1336 mod->name(),importedMod->name(),importedMod->partitionName());
1337 toModuleDefImpl(intfMod)->addPartition(toModuleDefImpl(importedMod));
1338 toModuleDefImpl(importedMod)->setPrimaryInterface(intfMod);
1339 for (const auto &[partitionFileName_,partitionImportInfoList] : importedMod->getImports())
1340 {
1341 for (const auto &partitionImportInfo : partitionImportInfoList)
1342 {
1343 if (partitionImportInfo.exported && intfMod->name()!=partitionImportInfo.importName)
1344 {
1345 toModuleDefImpl(intfMod)->addExportedModule(partitionImportInfo.importName,partitionImportInfo);
1346 }
1347 }
1348 }
1349 resolvePartitionsRecursively(intfMod,importedMod);
1350 }
1351 }
1352 }
1353 }
1354 }
1355 }
1356}
1357
1359{
1360 AUTO_TRACE();
1361 for (auto &mod : p->moduleFileMap) // foreach module
1362 {
1363 if (mod->moduleType()==ModuleDef::Type::Interface && mod->partitionName().isEmpty())
1364 { // that is a primary interface
1365 resolvePartitionsRecursively(mod.get(),mod.get());
1366 }
1367
1368 // copy exported imports to m_exportedModules
1369 for (const auto &[fileName,importInfoList] : mod->getImports())
1370 {
1371 for (const auto &importInfo : importInfoList)
1372 {
1373 if (importInfo.exported && mod->name()!=importInfo.importName)
1374 {
1375 toModuleDefImpl(mod)->addExportedModule(importInfo.importName,importInfo);
1376 }
1377 }
1378 }
1379
1380 // also link the ModuleDef and FileDef together
1381 bool ambig = false;
1382 FileDef *fd = findFileDef(Doxygen::inputNameLinkedMap,mod->getDefFileName(),ambig);
1383 if (fd)
1384 {
1385 fd->setModuleDef(mod.get());
1386 toModuleDefImpl(mod)->setFileDef(fd);
1387 }
1388 }
1389}
1390
1392{
1393 AUTO_TRACE();
1394 for (auto &mod : p->moduleFileMap)
1395 {
1396 FileDef *fd = mod->getFileDef();
1397 if (fd)
1398 {
1399 for (const auto &[fileName,importInfoList] : mod->getImports())
1400 {
1401 for (const auto &importInfo : importInfoList)
1402 {
1403 ModuleDef *importedModule = getPrimaryInterface(importInfo.importName);
1404 const FileDef *importedFd = importedModule ? importedModule->getFileDef() : nullptr;
1405 AUTO_TRACE_ADD("module: addIncludeDependency {}->{}:{} fd={}",
1406 mod->qualifiedName(), importInfo.qualifiedName(), importInfo.line, fd?fd->absFilePath():"");
1408 }
1409 }
1410 }
1411 }
1412 for (const auto &[fileName,importInfoList] : p->externalImports)
1413 {
1414 for (const auto &importInfo : importInfoList)
1415 {
1416 bool ambig = false;
1418 AUTO_TRACE_ADD("externalImport name={} fd={}",fileName,(void*)fd);
1419 if (fd)
1420 {
1421 ModuleDef *mod = getPrimaryInterface(importInfo.importName);
1422 FileDef *importedFd = mod ? mod->getFileDef() : nullptr;
1423 fd->addIncludeDependency(importedFd,importInfo.importName,IncludeKind::ImportModule);
1424 if (importedFd)
1425 {
1427 }
1428 }
1429 }
1430 }
1431 for (const auto &headerInfo : p->headers)
1432 {
1433 bool ambig = false;
1434 FileDef *fd = findFileDef(Doxygen::inputNameLinkedMap,headerInfo.fileName,ambig);
1435 AUTO_TRACE_ADD("header name={} fd={}",headerInfo.fileName,(void*)fd);
1436 if (fd)
1437 {
1438 QCString resolvedHeader = determineAbsoluteIncludeName(headerInfo.fileName,headerInfo.headerName);
1439 FileDef *importFd = findFileDef(Doxygen::inputNameLinkedMap,resolvedHeader,ambig);
1440 fd->addIncludeDependency(importFd, headerInfo.headerName,
1441 headerInfo.isSystem ? IncludeKind::ImportSystem : IncludeKind::ImportLocal);
1442 if (importFd)
1443 {
1445 }
1446 }
1447 }
1448}
1449
1451{
1452 AUTO_TRACE("{}: collecting symbols for partition {}",intfMod->qualifiedName(),partitionMod->qualifiedName());
1453 auto intfModImpl = toModuleDefImpl(intfMod);
1454 auto partitionModImpl = toModuleDefImpl(partitionMod);
1455 intfModImpl->mergeSymbolsFrom(partitionModImpl);
1456}
1457
1459{
1460 AUTO_TRACE();
1461 for (auto &mod : p->moduleFileMap) // foreach module
1462 {
1463 if (mod->isPrimaryInterface()) // that is a primary interface
1464 {
1465 for (auto &[partitionName,partitionMod] : mod->partitions())
1466 {
1467 collectExportedSymbolsRecursively(mod.get(),partitionMod);
1468 }
1469
1470 // collect all files that contribute to this module (e.g. implementation/partition modules)
1471 auto it = p->moduleNameMap.find(mod->name().str());
1472 if (it != p->moduleNameMap.end())
1473 {
1474 for (auto contributingMod : it->second)
1475 {
1476 AUTO_TRACE_ADD(" adding contributing module {} to interface module {} type={} partition={} isPrimaryIntf={}",
1477 contributingMod->qualifiedName(),
1478 mod->name(),
1479 contributingMod->moduleType()==ModuleDef::Type::Interface ? "Interface" : "Implementation",
1480 contributingMod->partitionName(),
1481 contributingMod->isPrimaryInterface());
1483 }
1484 }
1485 }
1486 }
1487}
1488
1490{
1491 for (auto &mod : p->moduleFileMap) // foreach module
1492 {
1494 }
1495}
1496
1498{
1499 for (auto &mod : p->moduleFileMap) // foreach module
1500 {
1501 if (mod->isPrimaryInterface())
1502 {
1503 mod->writeDocumentation(ol);
1504 }
1505 }
1506}
1507
1509{
1510 int count=0;
1511 for (const auto &mod : p->moduleFileMap) // foreach module
1512 {
1513 if (mod->isPrimaryInterface()) count++;
1514 }
1515 return count;
1516}
1517
1519{
1520 return p->moduleFileMap;
1521}
1522
1524{
1525 return p->moduleFileMap;
1526}
1527
1529{
1530 AUTO_TRACE("file={} module={}",root->fileName,root->name);
1531 if (root->doc.isEmpty() && root->brief.isEmpty()) return;
1532 if (root->name.find(':')!=-1)
1533 {
1534 warn(root->fileName,root->startLine,"Ignoring documentation for module partition {}. Please place documentation at the primary module name",
1535 root->name);
1536 }
1537 else
1538 {
1539 auto it = p->moduleNameMap.find(root->name.str());
1540 if (it != p->moduleNameMap.end())
1541 {
1542 ModuleDef *mod = getPrimaryInterface(root->name);
1543 if (mod)
1544 {
1545 mod->setDocumentation(root->doc,root->docFile,root->docLine);
1546 mod->setBriefDescription(root->brief,root->briefFile,root->briefLine);
1547 mod->setId(root->id);
1548 mod->setHidden(root->hidden);
1549 mod->setBodySegment(root->startLine,root->bodyLine,root->endBodyLine);
1550 mod->setRefItems(root->sli);
1551 //mod->addSectionsToDefinition(root->anchors);
1552 addModuleToGroups(root,mod);
1553 }
1554 else
1555 {
1556 warn(root->fileName,root->startLine,"Found documentation for module {} but it has no primary interface unit.",root->name);
1557 }
1558 }
1559 else
1560 {
1561 warn(root->fileName,root->startLine,"Found documentation for unknown module {}.",root->name);
1562 }
1563 }
1564}
1565
1567{
1568 auto it = p->moduleNameMap.find(moduleName.str());
1569 if (it != p->moduleNameMap.end())
1570 {
1571 for (const auto &mod : it->second)
1572 {
1573 if (mod->isPrimaryInterface())
1574 {
1575 return mod;
1576 }
1577 }
1578 }
1579 return nullptr;
1580}
1581
1583{
1584 for (const auto &mod : p->moduleFileMap) // foreach module
1585 {
1586 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->addListReferences();
1587 }
1588}
1589
1591{
1592 for (const auto &mod : p->moduleFileMap) // foreach module
1593 {
1594 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->addMembersToMemberGroup();
1595 }
1596}
1597
1599{
1600 for (const auto &mod : p->moduleFileMap) // foreach module
1601 {
1602 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->distributeMemberGroupDocumentation();
1603 }
1604}
1605
1607{
1608 for (auto &mod : p->moduleFileMap) // foreach module
1609 {
1610 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->findSectionsInDocumentation();
1611 }
1612}
1613
1615{
1616 for (auto &mod : p->moduleFileMap) // foreach module
1617 {
1618 if (mod->isPrimaryInterface()) toModuleDefImpl(mod)->sortMemberLists();
1619 }
1620}
1621
A abstract class representing of a compound symbol.
Definition classdef.h:104
virtual QCString className() const =0
Returns the name of the class including outer classes, but not including namespaces.
The common base class of all entity definitions found in the sources.
Definition definition.h:76
virtual bool isLinkable() const =0
virtual QCString anchor() const =0
virtual bool isExported() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual QCString getReference() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual QCString getOutputFileBase() const =0
virtual const QCString & name() const =0
int getDefLine() const override
bool isReference() const override
const QCString & name() const override
QCString getDefFileName() const override
bool isExported() const override
bool hasBriefDescription() const override
void setId(const QCString &name) override
QCString docFile() const override
QCString briefFile() const override
QCString id() const override
void setReference(const QCString &r) override
const RefItemVector & xrefListItems() const override
QCString briefDescription(bool abbreviate=FALSE) const override
QCString getReference() const override
DefinitionMixin(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=TRUE)
bool isHidden() const override
QCString inbodyDocumentation() const override
int docLine() const override
int briefLine() const override
QCString documentation() const override
void writeDocAnchorsToTagFile(TextStream &fs) const override
bool hasDocumentation() const override
SrcLangExt getLanguage() const override
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setHidden(bool b)=0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual void setId(const QCString &name)=0
virtual void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)=0
virtual void setRefItems(const RefItemVector &sli)=0
static bool suppressDocWarnings
Definition doxygen.h:132
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:105
Represents an unstructured piece of information, about an entity found in the sources.
Definition entry.h:116
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
bool exported
is the symbol exported from a C++20 module
Definition entry.h:189
QCString id
libclang id
Definition entry.h:231
QCString fileName
file this entry was extracted from
Definition entry.h:223
int startLine
start line of entry in the source
Definition entry.h:224
QCString name
member name
Definition entry.h:174
QCString briefFile
file in which the brief desc. was found
Definition entry.h:205
int bodyLine
line number of the body in the source
Definition entry.h:216
QCString doc
documentation block (partly parsed)
Definition entry.h:200
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
Definition entry.h:226
QCString docFile
file in which the documentation was found
Definition entry.h:202
bool hidden
does this represent an entity that is hidden from the output
Definition entry.h:228
QCString brief
brief description (doc block)
Definition entry.h:203
int briefLine
line number at which the brief desc. was found
Definition entry.h:204
A model of a file symbol.
Definition filedef.h:99
virtual void setModuleDef(ModuleDef *mod)=0
virtual void addIncludedByDependency(const FileDef *fd, const QCString &incName, IncludeKind kind)=0
virtual QCString getPath() const =0
virtual QCString absFilePath() const =0
virtual QCString fileName() const =0
virtual void addIncludeDependency(const FileDef *fd, const QCString &incName, IncludeKind kind)=0
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1435
A model of a class/file/namespace member symbol.
Definition memberdef.h:48
virtual MemberType memberType() const =0
virtual void setSectionList(const Definition *container, const MemberList *sl)=0
A list of MemberDef objects as shown in documentation sections.
Definition memberlist.h:109
void writeDeclarations(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, const QCString &title, const QCString &subtitle, bool showEnumValues=FALSE, bool showInline=FALSE, const ClassDef *inheritedFrom=nullptr, MemberListType lt=MemberListType::PubMethods(), bool showSectionTitle=true) const
Writes the list of members to the output.
void writeTagFile(TextStream &, bool useQualifiedName=false, bool showNamespaceMembers=true)
MemberListType listType() const
Definition memberlist.h:114
void writeDocumentation(OutputList &ol, const QCString &scopeName, const Definition *container, const QCString &title, bool showEnumValues=FALSE, bool showInline=FALSE) const
bool declVisible() const
Wrapper class for the MemberListType type.
Definition types.h:346
constexpr const char * toLabel() const
Definition types.h:402
bool contains(const MemberDef *md) const
Definition memberlist.h:89
void push_back(const T &value)
Definition memberlist.h:48
virtual const ImportInfoMap & getImports() const =0
virtual FileDef * getFileDef() const =0
void countMembers()
void addPartition(ModuleDefImpl *mod)
void distributeMemberGroupDocumentation()
QCString anchor() const override
Definition moduledef.cpp:61
void startMemberDeclarations(OutputList &ol)
DefType definitionType() const override
Definition moduledef.cpp:57
void sortMemberLists()
QCString getOutputFileBase() const override
void endMemberDeclarations(OutputList &ol)
MemberList * getMemberList(MemberListType lt) const override
void writeDocumentation(OutputList &ol) override
FileList getUsedFiles() const override
void writeMemberDocumentation(OutputList &ol, MemberListType lt, const QCString &title)
ModuleList m_contributing
void addMemberToModule(const Entry *root, MemberDef *md)
bool isPrimaryInterface() const override
Definition moduledef.cpp:75
QCString qualifiedName() const override
void addConceptToModule(const Entry *root, ConceptDef *cd)
FileDef * getFileDef() const override
Definition moduledef.cpp:82
QCString partitionName() const override
Definition moduledef.cpp:73
void addClassToModule(const Entry *root, ClassDef *cd)
bool isLinkableInProject() const override
Definition moduledef.cpp:62
FileDef * m_fileDef
void writeTagFile(TextStream &t) const override
void writeMemberGroups(OutputList &ol)
const ModuleDef * m_primaryInterface
void startMemberDocumentation(OutputList &ol)
void writeAuthorSection(OutputList &ol)
const ImportInfoMap & getImports() const override
Definition moduledef.cpp:83
MemberLists m_memberLists
int countVisibleMembers() const override
void setPrimaryInterface(const ModuleDef *mod)
void writeClassDeclarations(OutputList &ol, const QCString &title)
void mergeSymbolsFrom(ModuleDefImpl *other)
void writeExports(OutputList &ol, const QCString &title)
const ClassLinkedRefMap & getClasses() const override
Definition moduledef.cpp:79
void addMembersToMemberGroup()
void writeFiles(OutputList &ol, const QCString &title)
void addExportedModule(const QCString &moduleName, const ImportInfo &info)
void endMemberDocumentation(OutputList &ol)
void setFileDef(FileDef *fd)
QCString m_partitionName
ConceptLinkedRefMap m_concepts
void addMemberToList(MemberListType lt, MemberDef *md)
void writeDetailedDescription(OutputList &ol, const QCString &title)
CodeSymbolType codeSymbolType() const override
Definition moduledef.cpp:58
const ImportInfoMap & getExports() const override
Definition moduledef.cpp:84
void writeBriefDescription(OutputList &ol)
ModuleDefImpl(const QCString &fileName, int startLine, int startColom, const QCString &name, Type type, const QCString &partitionName)
Definition moduledef.cpp:51
void writeMemberDeclarations(OutputList &ol, MemberListType lt, const QCString &title)
ClassLinkedRefMap m_classes
const MemberGroupList & getMemberGroups() const override
Definition moduledef.cpp:78
void findSectionsInDocumentation()
ImportInfoMap m_exportedModules
ModuleMap m_partitions
void addImport(int line, const QCString &moduleName, const QCString &partitionName, bool isExported)
bool isLinkable() const override
Definition moduledef.cpp:65
QCString displayName(bool=TRUE) const override
Definition moduledef.cpp:59
ImportInfoMap m_imports
bool hasDetailedDescription() const
void addContributingModule(ModuleDefImpl *mod)
void writeSummaryLinks(OutputList &ol) const override
Type moduleType() const override
Definition moduledef.cpp:72
const ModuleMap & partitions() const override
Definition moduledef.cpp:85
const MemberLists & getMemberLists() const override
Definition moduledef.cpp:77
void writeDeclarationLink(OutputList &ol, bool &found, const QCString &header, bool localNames) const
MemberGroupList m_memberGroups
void writeConcepts(OutputList &ol, const QCString &title)
void addListReferences()
const ConceptLinkedRefMap & getConcepts() const override
Definition moduledef.cpp:80
void addHeader(int line, const QCString &headerName, bool isSystem)
bool declVisible() const
void writeDeclaration(OutputList &ol, const QCString &header, bool localNames) const
void addListReferences()
int numDocumentedModules() const
void sortMemberLists()
void resolveImports()
static ModuleManager & instance()
void addDocs(const Entry *root)
void collectExportedSymbolsRecursively(ModuleDef *intfMod, ModuleDef *mod)
void addHeader(const QCString &moduleFile, int line, const QCString &headerName, bool isSystem)
void countMembers()
void addConceptToModule(const Entry *root, ConceptDef *cd)
ModuleLinkedMap & modules()
void addTagInfo(const QCString &moduleFile, const QCString &tagName, const QCString &clangId)
void addClassToModule(const Entry *root, ClassDef *cd)
void createModuleDef(const QCString &fileName, int line, int column, bool exported, const QCString &moduleName, const QCString &partitionName=QCString())
ModuleDef * getPrimaryInterface(const QCString &moduleName) const
void addMemberToModule(const Entry *root, MemberDef *md)
void writeDocumentation(OutputList &ol)
void addMembersToMemberGroup()
void resolvePartitions()
std::unique_ptr< Private > p
Definition moduledef.h:147
void findSectionsInDocumentation()
void collectExportedSymbols()
void resolvePartitionsRecursively(ModuleDef *intfMod, ModuleDef *mod)
void addImport(const QCString &moduleFile, int line, const QCString &importName, bool isExported, const QCString &partitionName=QCString())
void distributeMemberGroupDocumentation()
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:314
void endTextBlock(bool paraBreak=FALSE)
Definition outputlist.h:671
void writeString(const QCString &text)
Definition outputlist.h:412
void startGroupHeader(int extraLevels=0)
Definition outputlist.h:454
void startMemberDeclaration()
Definition outputlist.h:570
void endTitleHead(const QCString &fileName, const QCString &name)
Definition outputlist.h:406
void disable(OutputType o)
void startTitleHead(const QCString &fileName)
Definition outputlist.h:404
void writeRuler()
Definition outputlist.h:522
void enable(OutputType o)
void endHeaderSection()
Definition outputlist.h:468
void endMemberDescription()
Definition outputlist.h:568
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:440
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md)
Definition outputlist.h:384
void startMemberDescription(const QCString &anchor, const QCString &inheritId=QCString(), bool typ=false)
Definition outputlist.h:566
void startHeaderSection()
Definition outputlist.h:466
void docify(const QCString &s)
Definition outputlist.h:438
void startParagraph(const QCString &classDef=QCString())
Definition outputlist.h:408
void startTextBlock(bool dense=FALSE)
Definition outputlist.h:669
void endParagraph()
Definition outputlist.h:410
void startMemberSections()
Definition outputlist.h:462
void startMemberList()
Definition outputlist.h:482
void endTextLink()
Definition outputlist.h:445
void startBold()
Definition outputlist.h:562
void endMemberItem(OutputGenerator::MemberItemType type)
Definition outputlist.h:496
void endMemberList()
Definition outputlist.h:484
void writeSynopsis()
Definition outputlist.h:593
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
void pushGeneratorState()
void insertMemberAlign(bool templ=FALSE)
Definition outputlist.h:518
void disableAllBut(OutputType o)
void popGeneratorState()
void writeSummaryLink(const QCString &file, const QCString &anchor, const QCString &title, bool first)
Definition outputlist.h:615
void writeAnchor(const QCString &fileName, const QCString &name)
Definition outputlist.h:524
void endBold()
Definition outputlist.h:564
void endGroupHeader(int extraLevels=0)
Definition outputlist.h:456
void startContents()
Definition outputlist.h:617
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:572
void enableAll()
void endMemberHeader()
Definition outputlist.h:472
void startMemberItem(const QCString &anchor, OutputGenerator::MemberItemType type, const QCString &id=QCString())
Definition outputlist.h:494
void parseText(const QCString &textStr)
void startTextLink(const QCString &file, const QCString &anchor)
Definition outputlist.h:443
void startMemberHeader(const QCString &anchor, int typ=2)
Definition outputlist.h:470
void endMemberSections()
Definition outputlist.h:464
This is an alternative implementation of QCString.
Definition qcstring.h:101
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
const std::string & str() const
Definition qcstring.h:537
Text streaming class that buffers data.
Definition textstream.h:36
ClassDefMutable * toClassDefMutable(Definition *d)
ConceptDefMutable * toConceptDefMutable(Definition *d)
#define Config_getBool(name)
Definition config.h:33
#define Config_getString(name)
Definition config.h:32
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:47
#define AUTO_TRACE(...)
Definition docnode.cpp:46
void docFindSections(const QCString &input, const Definition *d, const QCString &fileName)
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:55
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
static void writeTagFile()
@ ImportLocal
Definition filedef.h:54
@ ImportModule
Definition filedef.h:55
@ ImportSystem
Definition filedef.h:53
void addModuleToGroups(const Entry *root, ModuleDef *mod)
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
Definition index.cpp:426
void startFile(OutputList &ol, const QCString &name, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel)
Definition index.cpp:400
Translator * theTranslator
Definition language.cpp:71
MemberDefMutable * toMemberDefMutable(Definition *d)
#define warn(file, line, fmt,...)
Definition message.h:97
#define err(fmt,...)
Definition message.h:127
std::vector< HeaderInfo > HeaderInfoVector
Definition moduledef.cpp:45
static ModuleDefImpl * toModuleDefImpl(ModuleDef *m)
ModuleDef * toModuleDef(Definition *d)
std::unordered_map< std::string, ModuleDef * > ModuleMap
Definition moduledef.h:60
std::unordered_map< std::string, ImportInfoList > ImportInfoMap
Definition moduledef.h:61
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
const char * qPrint(const char *s)
Definition qcstring.h:672
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
std::vector< RefItem * > RefItemVector
Definition reflist.h:133
QCString headerName
Definition moduledef.cpp:41
bool isSystem
Definition moduledef.cpp:42
HeaderInfo(const QCString &fn, const QCString &name, bool sys)
Definition moduledef.cpp:38
QCString fileName
Definition moduledef.cpp:40
QCString importName
Definition moduledef.h:44
Represents of a member declaration list with configurable title and subtitle.
Definition layout.h:112
QCString title(SrcLangExt lang) const
Definition layout.cpp:1786
MemberListType type
Definition layout.h:118
bool visible() const override
Definition layout.h:121
Represents of a member definition list with configurable title.
Definition layout.h:132
MemberListType type
Definition layout.h:137
QCString title(SrcLangExt lang) const
Definition layout.cpp:1798
Definition layout.h:102
QCString title(SrcLangExt lang) const
Definition layout.cpp:1779
ModuleLinkedMap moduleFileMap
ImportInfoMap externalImports
HeaderInfoVector headers
std::unordered_map< std::string, ModuleList > moduleNameMap
CodeSymbolType
Definition types.h:481
@ Enumeration
Definition types.h:557
@ Variable
Definition types.h:555
@ Typedef
Definition types.h:556
@ Function
Definition types.h:554
SrcLangExt
Definition types.h:207
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
Definition util.cpp:5311
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:5398
bool found
Definition util.cpp:984
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:309
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
Definition util.cpp:4013
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:4421
QCString determineAbsoluteIncludeName(const QCString &curFile, const QCString &incFileName)
Definition util.cpp:4109
FileDef * findFileDef(const FileNameLinkedMap *fnMap, const QCString &n, bool &ambig)
Definition util.cpp:3408
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:5408
A bunch of utility functions.