Doxygen
Loading...
Searching...
No Matches
groupdef.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 *
4 *
5 * Copyright (C) 1997-2015 by Dimitri van Heesch.
6 *
7 * Permission to use, copy, modify, and distribute this software and its
8 * documentation under the terms of the GNU General Public License is hereby
9 * granted. No representations are made about the suitability of this software
10 * for any purpose. It is provided "as is" without express or implied warranty.
11 * See the GNU General Public License for more details.
12 *
13 * Documents produced by Doxygen are derivative works derived from the
14 * input used in their production; they are not affected by this license.
15 *
16 */
17
18#include <algorithm>
19#include <vector>
20
21#include <ctype.h>
22
23#include "groupdef.h"
24#include "classdef.h"
25#include "filedef.h"
26#include "classlist.h"
27#include "outputlist.h"
28#include "namespacedef.h"
29#include "language.h"
30#include "util.h"
31#include "memberlist.h"
32#include "message.h"
33#include "membergroup.h"
34#include "doxygen.h"
35#include "pagedef.h"
36#include "docparser.h"
37#include "searchindex.h"
38#include "dot.h"
40#include "vhdldocgen.h"
41#include "layout.h"
42#include "arguments.h"
43#include "entry.h"
44#include "membername.h"
45#include "dirdef.h"
46#include "config.h"
47#include "definitionimpl.h"
48#include "regex.h"
49#include "moduledef.h"
50
51//---------------------------------------------------------------------------
52
53class GroupDefImpl : public DefinitionMixin<GroupDef>
54{
55 public:
56 GroupDefImpl(const QCString &fileName,int line,const QCString &name,const QCString &title,const QCString &refFileName=QCString());
57 ~GroupDefImpl() override;
59
60 DefType definitionType() const override { return TypeGroup; }
62 QCString getOutputFileBase() const override;
63 QCString anchor() const override { return QCString(); }
64 QCString displayName(bool=TRUE) const override { return hasGroupTitle() ? m_title : DefinitionMixin::name(); }
65 QCString groupTitle() const override { return m_title; }
66 void setGroupTitle( const QCString &newtitle ) override;
67 bool hasGroupTitle( ) const override { return m_titleSet; }
68 void addFile(FileDef *def) override;
69 bool containsFile(const FileDef *def) const override;
70 bool addClass(ClassDef *def) override;
71 bool addConcept(ConceptDef *def) override;
72 bool addModule(ModuleDef *def) override;
73 bool addNamespace(NamespaceDef *def) override;
74 void addGroup(GroupDef *def) override;
75 void addPage(PageDef *def) override;
76 void addExample(PageDef *def) override;
77 void addDir(DirDef *dd) override;
78 bool insertMember(MemberDef *def,bool docOnly=FALSE) override;
79 void removeMember(MemberDef *md) override;
80 bool findGroup(const GroupDef *def) const override; // true if def is a subgroup of this group
81 void writeDocumentation(OutputList &ol) override;
82 void writeMemberPages(OutputList &ol, int hierarchyLevel) override;
83 void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const override;
84 void writeTagFile(TextStream &) override;
85 size_t numDocMembers() const override;
86 bool isLinkableInProject() const override;
87 bool isLinkable() const override;
88 bool isVisibleInHierarchy() const override;
89 bool isASubGroup() const override;
90 void computeAnchors() override;
91 void countMembers() override;
92
93 void addMembersToMemberGroup() override;
95 void findSectionsInDocumentation() override;
96
97 void addListReferences() override;
98 void sortMemberLists() override;
99 bool subGrouping() const override { return m_subGrouping; }
100
101 void setGroupScope(Definition *d) override { m_groupScope = d; }
102 Definition *getGroupScope() const override { return m_groupScope; }
103
104 MemberList *getMemberList(MemberListType lt) const override;
105 const MemberLists &getMemberLists() const override { return m_memberLists; }
106
107 /* user defined member groups */
108 const MemberGroupList &getMemberGroups() const override { return m_memberGroups; }
109
110 const FileList &getFiles() const override { return m_fileList; }
111 const ClassLinkedRefMap &getClasses() const override { return m_classes; }
112 const ConceptLinkedRefMap &getConcepts() const override { return m_concepts; }
113 const ModuleLinkedRefMap &getModules() const override { return m_modules; }
114 const NamespaceLinkedRefMap &getNamespaces() const override { return m_namespaces; }
115 const GroupList &getSubGroups() const override { return m_groups; }
116 const PageLinkedRefMap &getPages() const override { return m_pages; }
117 const DirList & getDirs() const override { return m_dirList; }
118 const PageLinkedRefMap &getExamples() const override { return m_examples; }
119 bool hasDetailedDescription() const override;
120 void sortSubGroups() override;
121 void writeSummaryLinks(OutputList &ol) const override;
122 void writePageNavigation(OutputList &ol) const override;
123
124 bool hasGroupGraph() const override;
125 void overrideGroupGraph(bool e) override;
126 private:
127 void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
132 void writeGroupGraph(OutputList &ol);
133 void writeFiles(OutputList &ol,const QCString &title);
134 void writeNamespaces(OutputList &ol,const QCString &title);
135 void writeNestedGroups(OutputList &ol,const QCString &title);
136 void writeDirs(OutputList &ol,const QCString &title);
137 void writeClasses(OutputList &ol,const QCString &title);
138 void writeConcepts(OutputList &ol,const QCString &title);
139 void writeModules(OutputList &ol,const QCString &title);
142 void writeDetailedDescription(OutputList &ol,const QCString &title);
150 void updateLanguage(const Definition *);
151 void setGroupTitleLocal( const QCString &title);
152
153 QCString m_title; // title of the group
154 bool m_titleSet; // true if title is not the same as the name
155 QCString m_fileName; // base name of the generated file
156 FileList m_fileList; // list of files in the group
157 ClassLinkedRefMap m_classes; // list of classes in the group
158 ConceptLinkedRefMap m_concepts; // list of concepts in the group
159 ModuleLinkedRefMap m_modules; // list of modules in the group
160 NamespaceLinkedRefMap m_namespaces; // list of namespaces in the group
161 GroupList m_groups; // list of sub groups.
162 PageLinkedRefMap m_pages; // list of pages in the group
163 PageLinkedRefMap m_examples; // list of examples in the group
164 DirList m_dirList; // list of directories in the group
171 bool m_hasGroupGraph = false;
172
173};
174
175std::unique_ptr<GroupDef> createGroupDef(const QCString &fileName,int line,const QCString &name,
176 const QCString &title,const QCString &refFileName)
177{
178 return std::make_unique<GroupDefImpl>(fileName,line,name,title,refFileName);
179}
180
181
182//---------------------------------------------------------------------------
183
184GroupDefImpl::GroupDefImpl(const QCString &df,int dl,const QCString &na,const QCString &t,
185 const QCString &refFileName) : DefinitionMixin(df,dl,1,na),
187{
188 if (!refFileName.isEmpty())
189 {
190 m_fileName=stripExtension(refFileName);
191 }
192 else
193 {
194 m_fileName = convertNameToFile(QCString("group_")+na);
195 }
197
198 //visited = 0;
199 m_groupScope = nullptr;
200 m_subGrouping=Config_getBool(SUBGROUPING);
201 m_hasGroupGraph=Config_getBool(GROUP_GRAPHS);
202}
203
207
209{
210 if ( !t.isEmpty())
211 {
212 m_title = t;
214 }
215 else
216 {
217 m_title = name();
218 m_title[0]=static_cast<char>(toupper(m_title[0]));
220 }
221}
222
224{
226}
227
228
230{
231 for (const auto &mg : m_memberGroups)
232 {
233 mg->distributeMemberGroupDocumentation();
234 }
235}
236
238{
242
243 for (const auto &mg : m_memberGroups)
244 {
245 mg->findSectionsInDocumentation(this);
246 }
247
248 for (auto &ml : m_memberLists)
249 {
250 if (ml->listType().isDeclaration())
251 {
252 ml->findSectionsInDocumentation(this);
253 }
254 }
255}
256
258{
259 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
260 if (def->isHidden()) return;
261 updateLanguage(def);
262 if (sortBriefDocs)
263 m_fileList.insert( std::upper_bound( m_fileList.begin(), m_fileList.end(), def,
264 [](const auto &fd1, const auto &fd2)
265 { return qstricmp_sort(fd1->name(),fd2->name())<0; }),
266 def);
267 else
268 m_fileList.push_back(def);
269}
270
272{
273 return std::find(m_fileList.cbegin(),m_fileList.cend(), def) != m_fileList.cend();
274}
275
277{
278 if (cd->isHidden()) return FALSE;
279 updateLanguage(cd);
280 QCString qn = cd->name();
281 if (m_classes.find(qn)==nullptr)
282 {
283 m_classes.add(qn,cd);
284 return TRUE;
285 }
286 return FALSE;
287}
288
290{
291 if (cd->isHidden()) return FALSE;
292 QCString qn = cd->name();
293 if (m_concepts.find(qn)==nullptr)
294 {
295 m_concepts.add(qn,cd);
296 return TRUE;
297 }
298 return FALSE;
299}
300
302{
303 if (mod->isHidden()) return false;
304 QCString qn = mod->name();
305 if (m_modules.find(qn)==nullptr)
306 {
307 m_modules.add(qn,mod);
308 return true;
309 }
310 return false;
311}
312
314{
315 //printf("adding namespace hidden=%d\n",def->isHidden());
316 if (def->isHidden()) return false;
317 if (m_namespaces.find(def->name())==nullptr)
318 {
319 updateLanguage(def);
320 m_namespaces.add(def->name(),def);
321 return true;
322 }
323 return false;
324}
325
327{
328 if (def->isHidden()) return;
329 m_dirList.push_back(def);
330}
331
333{
334 if (def->isHidden()) return;
335 //printf("Making page %s part of a group\n",qPrint(def->name));
336 m_pages.add(def->name(),def);
337 def->makePartOfGroup(this);
338}
339
341{
342 if (def->isHidden()) return;
343 m_examples.add(def->name(),def);
344}
345
346
348{
349 for (auto &ml : m_memberLists)
350 {
351 if (ml->listType().isDeclaration())
352 {
354 }
355 }
356}
357
358
360{
361 if (md->isHidden()) return FALSE;
362 updateLanguage(md);
363 //printf("GroupDef(%s)::insertMember(%s)\n", qPrint(title), qPrint(md->name()));
365 for (auto &srcMi : *mni)
366 {
367 const MemberDef *srcMd = srcMi->memberDef();
368 if (srcMd==md) return FALSE; // already added before!
369
370 bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
371 // both inside a file => definition and declaration do not have to be in the same file
374
375 const ArgumentList &srcMdAl = srcMd->argumentList();
376 const ArgumentList &mdAl = md->argumentList();
377 const ArgumentList &tSrcMdAl = srcMd->templateArguments();
378 const ArgumentList &tMdAl = md->templateArguments();
379
380 if (srcMd->isFunction() && md->isFunction() && // both are a function
381 (tSrcMdAl.size()==tMdAl.size()) && // same number of template arguments
382 matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),&srcMdAl,
383 md->getOuterScope(),md->getFileDef(),&mdAl,
384 TRUE,srcMd->getLanguage()
385 ) && // matching parameters
386 sameScope // both are found in the same scope
387 )
388 {
390 if (mdm && srcMd->getGroupAlias()==nullptr)
391 {
392 mdm->setGroupAlias(srcMd);
393 }
394 else if (mdm && md!=srcMd->getGroupAlias())
395 {
396 mdm->setGroupAlias(srcMd->getGroupAlias());
397 }
398 return FALSE; // member is the same as one that is already added
399 }
400 }
401 mni->push_back(std::make_unique<MemberInfo>(md,md->protection(),md->virtualness(),false,false));
402 //printf("Added member!\n");
403 m_allMemberList.push_back(md);
404 switch(md->memberType())
405 {
407 if (!docOnly)
408 {
409 addMemberToList(MemberListType::DecVarMembers(),md);
410 }
411 addMemberToList(MemberListType::DocVarMembers(),md);
412 break;
414 if (!docOnly)
415 {
416 addMemberToList(MemberListType::DecFuncMembers(),md);
417 }
418 addMemberToList(MemberListType::DocFuncMembers(),md);
419 break;
421 if (!docOnly)
422 {
423 addMemberToList(MemberListType::DecTypedefMembers(),md);
424 }
425 addMemberToList(MemberListType::DocTypedefMembers(),md);
426 break;
428 if (!docOnly)
429 {
430 addMemberToList(MemberListType::DecEnumMembers(),md);
431 }
432 addMemberToList(MemberListType::DocEnumMembers(),md);
433 break;
435 if (!docOnly)
436 {
437 addMemberToList(MemberListType::DecEnumValMembers(),md);
438 }
439 addMemberToList(MemberListType::DocEnumValMembers(),md);
440 break;
442 if (!docOnly)
443 {
444 addMemberToList(MemberListType::DecDefineMembers(),md);
445 }
446 addMemberToList(MemberListType::DocDefineMembers(),md);
447 break;
449 if (!docOnly)
450 {
451 addMemberToList(MemberListType::DecSignalMembers(),md);
452 }
453 addMemberToList(MemberListType::DocSignalMembers(),md);
454 break;
455 case MemberType::Slot:
456 if (md->protection()==Protection::Public)
457 {
458 if (!docOnly)
459 {
460 addMemberToList(MemberListType::DecPubSlotMembers(),md);
461 }
462 addMemberToList(MemberListType::DocPubSlotMembers(),md);
463 }
464 else if (md->protection()==Protection::Protected)
465 {
466 if (!docOnly)
467 {
468 addMemberToList(MemberListType::DecProSlotMembers(),md);
469 }
470 addMemberToList(MemberListType::DocProSlotMembers(),md);
471 }
472 else
473 {
474 if (!docOnly)
475 {
476 addMemberToList(MemberListType::DecPriSlotMembers(),md);
477 }
478 addMemberToList(MemberListType::DocPriSlotMembers(),md);
479 }
480 break;
482 if (!docOnly)
483 {
484 addMemberToList(MemberListType::DecEventMembers(),md);
485 }
486 addMemberToList(MemberListType::DocEventMembers(),md);
487 break;
489 if (!docOnly)
490 {
491 addMemberToList(MemberListType::DecPropMembers(),md);
492 }
493 addMemberToList(MemberListType::DocPropMembers(),md);
494 break;
496 if (!docOnly)
497 {
498 addMemberToList(MemberListType::DecFriendMembers(),md);
499 }
500 addMemberToList(MemberListType::DocFriendMembers(),md);
501 break;
502 default:
503 err("GroupDefImpl::insertMembers(): "
504 "member '{}' (typeid='{}') with scope '{}' inserted in group scope '{}'!\n",
505 md->name(),md->memberTypeName(),
506 md->getClassDef() ? md->getClassDef()->name() : "",
507 name());
508 }
509 return TRUE;
510}
511
513{
514 // fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", qPrint(title), qPrint(md->name()));
516 if (mni)
517 {
519
520 removeMemberFromList(MemberListType::AllMembersList(),md);
521 switch(md->memberType())
522 {
524 removeMemberFromList(MemberListType::DecVarMembers(),md);
525 removeMemberFromList(MemberListType::DocVarMembers(),md);
526 break;
528 removeMemberFromList(MemberListType::DecFuncMembers(),md);
529 removeMemberFromList(MemberListType::DocFuncMembers(),md);
530 break;
532 removeMemberFromList(MemberListType::DecTypedefMembers(),md);
533 removeMemberFromList(MemberListType::DocTypedefMembers(),md);
534 break;
536 removeMemberFromList(MemberListType::DecEnumMembers(),md);
537 removeMemberFromList(MemberListType::DocEnumMembers(),md);
538 break;
540 removeMemberFromList(MemberListType::DecEnumValMembers(),md);
541 removeMemberFromList(MemberListType::DocEnumValMembers(),md);
542 break;
544 removeMemberFromList(MemberListType::DecDefineMembers(),md);
545 removeMemberFromList(MemberListType::DocDefineMembers(),md);
546 break;
548 removeMemberFromList(MemberListType::DecSignalMembers(),md);
549 removeMemberFromList(MemberListType::DocSignalMembers(),md);
550 break;
551 case MemberType::Slot:
552 if (md->protection()==Protection::Public)
553 {
554 removeMemberFromList(MemberListType::DecPubSlotMembers(),md);
555 removeMemberFromList(MemberListType::DocPubSlotMembers(),md);
556 }
557 else if (md->protection()==Protection::Protected)
558 {
559 removeMemberFromList(MemberListType::DecProSlotMembers(),md);
560 removeMemberFromList(MemberListType::DocProSlotMembers(),md);
561 }
562 else
563 {
564 removeMemberFromList(MemberListType::DecPriSlotMembers(),md);
565 removeMemberFromList(MemberListType::DocPriSlotMembers(),md);
566 }
567 break;
569 removeMemberFromList(MemberListType::DecEventMembers(),md);
570 removeMemberFromList(MemberListType::DocEventMembers(),md);
571 break;
573 removeMemberFromList(MemberListType::DecPropMembers(),md);
574 removeMemberFromList(MemberListType::DocPropMembers(),md);
575 break;
577 removeMemberFromList(MemberListType::DecFriendMembers(),md);
578 removeMemberFromList(MemberListType::DocFriendMembers(),md);
579 break;
580 default:
581 err("GroupDefImpl::removeMember(): unexpected member remove in file!\n");
582 }
583 }
584}
585
586bool GroupDefImpl::findGroup(const GroupDef *def) const
587{
588 if (this==def)
589 {
590 return TRUE;
591 }
592 for (const auto &gd : m_groups)
593 {
594 if (gd->findGroup(def))
595 {
596 return TRUE;
597 }
598 }
599 return FALSE;
600}
601
603{
604 //printf("adding group '%s' to group '%s'\n",qPrint(def->name()),qPrint(name()));
605 //if (Config_getBool(SORT_MEMBER_DOCS))
606 // groupList->inSort(def);
607 //else
608 m_groups.push_back(def);
609}
610
612{
613 return !partOfGroups().empty();
614}
615
617{
618 for (auto &ml : m_memberLists)
619 {
620 ml->countDecMembers();
621 ml->countDocMembers();
622 }
623 for (const auto &mg : m_memberGroups)
624 {
625 mg->countDecMembers();
626 mg->countDocMembers();
627 }
628}
629
631{
632 return m_fileList.size()+
633 m_classes.size()+
634 m_namespaces.size()+
635 m_groups.size()+
636 m_allMemberList.size()+
637 m_pages.size()+
638 m_examples.size();
639}
640
641/*! Compute the HTML anchor names for all members in the group */
643{
644 //printf("GroupDefImpl::computeAnchors()\n");
645 m_allMemberList.setAnchors();
646}
647
649{
652 tagFile << " <compound kind=\"group\">\n";
653 tagFile << " <name>" << convertToXML(name()) << "</name>\n";
654 tagFile << " <title>" << convertToXML(m_title) << "</title>\n";
655 tagFile << " <filename>" << fn << "</filename>\n";
656 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
657 {
658 switch (lde->kind())
659 {
660 case LayoutDocEntry::GroupClasses:
661 {
662 for (const auto &cd : m_classes)
663 {
664 if (cd->isLinkableInProject())
665 {
666 tagFile << " <class kind=\"" << cd->compoundTypeString()
667 << "\">" << convertToXML(cd->name()) << "</class>\n";
668 }
669 }
670 }
671 break;
672 case LayoutDocEntry::GroupConcepts:
673 {
674 for (const auto &cd : m_concepts)
675 {
676 if (cd->isLinkableInProject())
677 {
678 tagFile << " <concept>" << convertToXML(cd->name())
679 << "</concept>\n";
680 }
681 }
682 }
683 break;
684 case LayoutDocEntry::GroupModules:
685 {
686 for (const auto &mod : m_modules)
687 {
688 if (mod->isLinkableInProject())
689 {
690 tagFile << " <module>" << convertToXML(mod->name())
691 << "</module>\n";
692 }
693 }
694 }
695 break;
696 case LayoutDocEntry::GroupNamespaces:
697 {
698 for (const auto &nd : m_namespaces)
699 {
700 if (nd->isLinkableInProject())
701 {
702 tagFile << " <namespace>" << convertToXML(nd->name())
703 << "</namespace>\n";
704 }
705 }
706 }
707 break;
708 case LayoutDocEntry::GroupFiles:
709 {
710 for (const auto &fd : m_fileList)
711 {
712 if (fd->isLinkableInProject())
713 {
714 tagFile << " <file>" << convertToXML(fd->name()) << "</file>\n";
715 }
716 }
717 }
718 break;
719 case LayoutDocEntry::GroupPageDocs:
720 {
721 for (const auto &pd : m_pages)
722 {
723 QCString pageName = pd->getOutputFileBase();
724 if (pd->isLinkableInProject())
725 {
726 tagFile << " <page>" << convertToXML(pageName) << "</page>\n";
727 }
728 }
729 }
730 break;
731 case LayoutDocEntry::GroupDirs:
732 {
733 for (const auto &dd : m_dirList)
734 {
735 if (dd->isLinkableInProject())
736 {
737 tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>\n";
738 }
739 }
740 }
741 break;
742 case LayoutDocEntry::GroupNestedGroups:
743 {
744 for (const auto &gd : m_groups)
745 {
746 if (gd->isVisible())
747 {
748 tagFile << " <subgroup>" << convertToXML(gd->name()) << "</subgroup>\n";
749 }
750 }
751 }
752 break;
753 case LayoutDocEntry::MemberDecl:
754 {
755 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
756 if (lmd)
757 {
758 MemberList * ml = getMemberList(lmd->type);
759 if (ml)
760 {
761 ml->writeTagFile(tagFile,true);
762 }
763 }
764 }
765 break;
766 case LayoutDocEntry::MemberGroups:
767 {
768 for (const auto &mg : m_memberGroups)
769 {
770 mg->writeTagFile(tagFile,true);
771 }
772 }
773 break;
774 default:
775 break;
776 }
777 }
779 tagFile << " </compound>\n";
780}
781
783{
784 if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
785 || !documentation().isEmpty() || !inbodyDocumentation().isEmpty()
786 )
787 {
789 if (m_pages.size()!=numDocMembers()) // not only pages -> classical layout
790 {
793 ol.writeRuler();
797 ol.writeAnchor(QCString(),"details");
799 }
800 else
801 {
802 ol.disableAllBut(OutputType::Man); // always print title for man page
803 }
804 ol.startGroupHeader("details");
805 ol.parseText(title);
806 ol.endGroupHeader();
808
809 // repeat brief description
810 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
811 {
813 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
814 }
815 // write separator between brief and details
816 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
817 !documentation().isEmpty())
818 {
822 ol.enableAll();
825 ol.writeString("\n\n");
827 }
828
829 // write detailed documentation
830 if (!documentation().isEmpty())
831 {
832 ol.generateDoc(docFile(),docLine(),this,nullptr,documentation()+"\n",TRUE,FALSE,
833 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
834 }
835
836 // write inbody documentation
837 if (!inbodyDocumentation().isEmpty())
838 {
840 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
841 }
842 }
843}
844
846{
848 {
849 auto parser { createDocParser() };
850 auto ast { validatingParseDoc(*parser.get(),
851 briefFile(),briefLine(),this,nullptr,
853 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT)) };
854 if (!ast->isEmpty())
855 {
856 ol.startParagraph();
859 ol.writeString(" - ");
861 ol.writeDoc(ast.get(),this,nullptr);
864 ol.writeString(" \n");
866
868 {
870 ol.startTextLink(QCString(),"details");
871 ol.parseText(theTranslator->trMore());
872 ol.endTextLink();
873 }
875 ol.endParagraph();
876 }
877 }
878 ol.writeSynopsis();
879}
880
882{
883 if (Config_getBool(HAVE_DOT) && m_hasGroupGraph /*&& Config_getBool(GROUP_GRAPHS)*/)
884 {
885 DotGroupCollaboration graph(this);
886 if (graph.isTooBig())
887 {
888 warn_uncond("Group dependency graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
889 name(), graph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
890 }
891 else if (!graph.isTrivial())
892 {
893 msg("Generating dependency graph for group {}\n",qualifiedName());
896 //ol.startParagraph();
898 ol.parseText(theTranslator->trCollaborationDiagram(m_title));
899 ol.endGroupCollaboration(graph);
900 //ol.endParagraph();
902 }
903 }
904}
905
907{
908 // write list of files
909 if (!m_fileList.empty())
910 {
911 ol.startMemberHeader("files");
912 ol.parseText(title);
913 ol.endMemberHeader();
914 ol.startMemberList();
915 for (const auto &fd : m_fileList)
916 {
917 if (!fd->hasDocumentation()) continue;
919 QCString anc = fd->anchor();
920 if (anc.isEmpty()) anc=fd->displayName(); else anc.prepend(fd->displayName()+"_");
922 ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
924 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),QCString(),fd->displayName());
926 if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
927 {
928 ol.startMemberDescription(fd->getOutputFileBase());
929 ol.generateDoc(briefFile(),briefLine(),fd,nullptr,fd->briefDescription(),FALSE,FALSE,
930 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
932 }
934 }
935 ol.endMemberList();
936 }
937}
938
940{
941 // write list of namespaces
942 m_namespaces.writeDeclaration(ol,title);
943}
944
946{
947 // write list of groups
948 int count=0;
949 for (const auto &gd : m_groups)
950 {
951 if (gd->isVisible()) count++;
952 }
953 if (count>0)
954 {
955 ol.startMemberHeader("groups");
956 ol.parseText(title);
957 ol.endMemberHeader();
958 ol.startMemberList();
959 for (const auto &gd : m_groups)
960 {
961 if (gd->isVisible())
962 {
963 if (!gd->hasDocumentation()) continue;
965 QCString anc = gd->anchor();
966 if (anc.isEmpty()) anc=gd->name(); else anc.prepend(gd->name()+"_");
969 ol.writeObjectLink(gd->getReference(),gd->getOutputFileBase(),QCString(),gd->groupTitle());
971 if (!gd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
972 {
973 ol.startMemberDescription(gd->getOutputFileBase());
974 ol.generateDoc(briefFile(),briefLine(),gd,nullptr,gd->briefDescription(),FALSE,FALSE,
975 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
977 }
979 }
980 }
981 ol.endMemberList();
982 }
983}
984
986{
987 // write list of directories
988 if (!m_dirList.empty())
989 {
990 ol.startMemberHeader("dirs");
991 ol.parseText(title);
992 ol.endMemberHeader();
993 ol.startMemberList();
994 for(const auto dd : m_dirList)
995 {
996 if (!dd->hasDocumentation()) continue;
998 QCString anc = dd->anchor();
999 if (anc.isEmpty()) anc=dd->shortName(); else anc.prepend(dd->shortName()+"_");
1001 ol.parseText(theTranslator->trDir(FALSE,TRUE));
1002 ol.insertMemberAlign();
1003 ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),QCString(),dd->shortName());
1005 if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
1006 {
1007 ol.startMemberDescription(dd->getOutputFileBase());
1008 ol.generateDoc(briefFile(),briefLine(),dd,nullptr,dd->briefDescription(),FALSE,FALSE,
1009 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
1011 }
1013 }
1014
1015 ol.endMemberList();
1016 }
1017}
1018
1020{
1021 // write list of classes
1022 m_classes.writeDeclaration(ol,nullptr,title,FALSE);
1023}
1024
1026{
1027 // write list of concepts
1028 m_concepts.writeDeclaration(ol,title,FALSE);
1029}
1030
1032{
1033 // write list of modules
1034 m_modules.writeDeclaration(ol,title,FALSE);
1035}
1036
1037
1039{
1040 m_classes.writeDocumentation(ol);
1041}
1042
1044{
1045 for (const auto *pd : m_pages)
1046 {
1047 if (!pd->isReference())
1048 {
1049 const SectionInfo *si=nullptr;
1050 if (pd->hasTitle() && !pd->name().isEmpty() &&
1051 (si=SectionManager::instance().find(pd->name()))!=nullptr)
1052 {
1054 ol.docify(si->title());
1056 }
1057 ol.startTextBlock();
1058 ol.generateDoc(pd->docFile(),pd->docLine(),pd,nullptr,(pd->documentation()+pd->inbodyDocumentation()),TRUE,FALSE,
1059 QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
1060 ol.endTextBlock();
1061 }
1062 }
1063}
1064
1066{
1067 /* write user defined member groups */
1068 for (const auto &mg : m_memberGroups)
1069 {
1070 mg->writeDeclarations(ol,nullptr,nullptr,nullptr,this,nullptr);
1071 }
1072}
1073
1078
1083
1085{
1086 //printf("** GroupDefImpl::startMemberDocumentation()\n");
1087 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1088 {
1089 ol.pushGeneratorState();
1092 }
1093}
1094
1096{
1097 //printf("** GroupDefImpl::endMemberDocumentation()\n");
1098 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1099 {
1100 ol.popGeneratorState();
1102 }
1103}
1104
1106{
1107 // write Author section (Man only)
1108 ol.pushGeneratorState();
1110 ol.startGroupHeader();
1111 ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
1112 ol.endGroupHeader();
1113 ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString(PROJECT_NAME)));
1114 ol.popGeneratorState();
1115}
1116
1118{
1119 ol.pushGeneratorState();
1121 bool first=TRUE;
1122 SrcLangExt lang = getLanguage();
1123 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1124 {
1125 if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classes.declVisible()) ||
1126 (lde->kind()==LayoutDocEntry::GroupConcepts && m_concepts.declVisible()) ||
1127 (lde->kind()==LayoutDocEntry::GroupModules && m_modules.declVisible()) ||
1128 (lde->kind()==LayoutDocEntry::GroupNamespaces && m_namespaces.declVisible(false)) ||
1129 (lde->kind()==LayoutDocEntry::GroupFiles && !m_fileList.empty()) ||
1130 (lde->kind()==LayoutDocEntry::GroupNestedGroups && !m_groups.empty()) ||
1131 (lde->kind()==LayoutDocEntry::GroupDirs && !m_dirList.empty())
1132 )
1133 {
1134 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1135 if (ls)
1136 {
1137 QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
1138 lde->kind()==LayoutDocEntry::GroupConcepts ? "concepts" :
1139 lde->kind()==LayoutDocEntry::GroupModules ? "modules" :
1140 lde->kind()==LayoutDocEntry::GroupNamespaces ? "namespaces" :
1141 lde->kind()==LayoutDocEntry::GroupFiles ? "files" :
1142 lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" :
1143 "dirs";
1144 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
1145 first=FALSE;
1146 }
1147 }
1148 else if (lde->kind()==LayoutDocEntry::MemberDecl)
1149 {
1150 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1151 if (lmd)
1152 {
1153 MemberList * ml = getMemberList(lmd->type);
1154 if (ml && ml->declVisible())
1155 {
1156 ol.writeSummaryLink(QCString(),ml->listType().toLabel(),lmd->title(lang),first);
1157 first=FALSE;
1158 }
1159 }
1160 }
1161 }
1162 if (!first)
1163 {
1164 ol.writeString(" </div>\n");
1165 }
1166 ol.popGeneratorState();
1167}
1168
1173
1175{
1176 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
1177 ol.pushGeneratorState();
1178
1179 // Find out how deep this group is nested. In case of multiple parents, use the first one.
1180 int hierarchyLevel = 0;
1181 const GroupDef *gd = this;
1182 while (!gd->partOfGroups().empty())
1183 {
1184 gd = gd->partOfGroups().front();
1185 ++hierarchyLevel;
1186 }
1187
1189 FALSE /* additionalIndices*/, QCString() /*altSidebarName*/, hierarchyLevel);
1190
1191 ol.startHeaderSection();
1192 bool writeOutlinePanel = generateTreeView && Config_getBool(PAGE_OUTLINE_PANEL);
1193 if (!writeOutlinePanel) writeSummaryLinks(ol);
1195 ol.pushGeneratorState();
1197 ol.parseText(m_title);
1198 ol.popGeneratorState();
1199 addGroupListToTitle(ol,this);
1200 ol.pushGeneratorState();
1203 ol.popGeneratorState();
1204 ol.pushGeneratorState();
1207 if (!m_title.isEmpty())
1208 {
1209 ol.writeString(" - ");
1210 ol.parseText(m_title);
1211 }
1212 ol.popGeneratorState();
1213 ol.endHeaderSection();
1214 ol.startContents();
1215
1216 //---------------------------------------- start flexible part -------------------------------
1217
1218 SrcLangExt lang=getLanguage();
1219 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1220 {
1221 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1222 switch (lde->kind())
1223 {
1224 case LayoutDocEntry::BriefDesc:
1226 break;
1227 case LayoutDocEntry::MemberDeclStart:
1229 break;
1230 case LayoutDocEntry::GroupClasses:
1231 if (ls) writeClasses(ol,ls->title(lang));
1232 break;
1233 case LayoutDocEntry::GroupConcepts:
1234 if (ls) writeConcepts(ol,ls->title(lang));
1235 break;
1236 case LayoutDocEntry::GroupModules:
1237 if (ls) writeModules(ol,ls->title(lang));
1238 break;
1239 case LayoutDocEntry::GroupInlineClasses:
1241 break;
1242 case LayoutDocEntry::GroupNamespaces:
1243 if (ls) writeNamespaces(ol,ls->title(lang));
1244 break;
1245 case LayoutDocEntry::MemberGroups:
1247 break;
1248 case LayoutDocEntry::MemberDecl:
1249 {
1250 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1251 if (lmd)
1252 {
1253 writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
1254 }
1255 }
1256 break;
1257 case LayoutDocEntry::MemberDeclEnd:
1259 break;
1260 case LayoutDocEntry::DetailedDesc:
1261 if (ls) writeDetailedDescription(ol,ls->title(lang));
1262 break;
1263 case LayoutDocEntry::MemberDefStart:
1265 break;
1266 case LayoutDocEntry::MemberDef:
1267 {
1268 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
1269 if (lmd)
1270 {
1271 writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
1272 }
1273 }
1274 break;
1275 case LayoutDocEntry::MemberDefEnd:
1277 break;
1278 case LayoutDocEntry::GroupNestedGroups:
1279 if (ls) writeNestedGroups(ol,ls->title(lang));
1280 break;
1281 case LayoutDocEntry::GroupPageDocs:
1283 break;
1284 case LayoutDocEntry::GroupDirs:
1285 if (ls) writeDirs(ol,ls->title(lang));
1286 break;
1287 case LayoutDocEntry::GroupFiles:
1288 if (ls) writeFiles(ol,ls->title(lang));
1289 break;
1290 case LayoutDocEntry::GroupGraph:
1291 writeGroupGraph(ol);
1292 break;
1293 case LayoutDocEntry::AuthorSection:
1295 break;
1296 case LayoutDocEntry::ClassIncludes:
1297 case LayoutDocEntry::ClassInheritanceGraph:
1298 case LayoutDocEntry::ClassNestedClasses:
1299 case LayoutDocEntry::ClassCollaborationGraph:
1300 case LayoutDocEntry::ClassAllMembersLink:
1301 case LayoutDocEntry::ClassUsedFiles:
1302 case LayoutDocEntry::ClassInlineClasses:
1303 case LayoutDocEntry::NamespaceNestedNamespaces:
1304 case LayoutDocEntry::NamespaceNestedConstantGroups:
1305 case LayoutDocEntry::NamespaceClasses:
1306 case LayoutDocEntry::NamespaceConcepts:
1307 case LayoutDocEntry::NamespaceInterfaces:
1308 case LayoutDocEntry::NamespaceStructs:
1309 case LayoutDocEntry::NamespaceExceptions:
1310 case LayoutDocEntry::NamespaceInlineClasses:
1311 case LayoutDocEntry::ConceptDefinition:
1312 case LayoutDocEntry::FileClasses:
1313 case LayoutDocEntry::FileConcepts:
1314 case LayoutDocEntry::FileInterfaces:
1315 case LayoutDocEntry::FileStructs:
1316 case LayoutDocEntry::FileExceptions:
1317 case LayoutDocEntry::FileNamespaces:
1318 case LayoutDocEntry::FileConstantGroups:
1319 case LayoutDocEntry::FileIncludes:
1320 case LayoutDocEntry::FileIncludeGraph:
1321 case LayoutDocEntry::FileIncludedByGraph:
1322 case LayoutDocEntry::FileSourceLink:
1323 case LayoutDocEntry::FileInlineClasses:
1324 case LayoutDocEntry::ModuleExports:
1325 case LayoutDocEntry::ModuleClasses:
1326 case LayoutDocEntry::ModuleConcepts:
1327 case LayoutDocEntry::ModuleUsedFiles:
1328 case LayoutDocEntry::DirSubDirs:
1329 case LayoutDocEntry::DirFiles:
1330 case LayoutDocEntry::DirGraph:
1331 err("Internal inconsistency: member '{}' should not be part of "
1332 "LayoutDocManager::Group entry list\n",lde->entryToString());
1333 break;
1334 }
1335 }
1336
1337 //---------------------------------------- end flexible part -------------------------------
1338
1339 for (auto &subgd : getSubGroups())
1340 {
1341 if (!subgd->isReference())
1342 {
1343 if (subgd->partOfGroups().front() == this)
1344 {
1345 ol.writePageLink(subgd->getOutputFileBase(), FALSE);
1346 }
1347 else
1348 {
1349 // Could write a note explaining that the subgroup belongs to another
1350 // group and add a link here.
1351 }
1352 }
1353 }
1354 if (generateTreeView && Config_getBool(PAGE_OUTLINE_PANEL))
1355 {
1356 ol.pushGeneratorState();
1358 ol.endContents();
1359 ol.writeString("</div><!-- doc-content -->\n");
1361 ol.writeString("</div><!-- container -->\n");
1362 ol.popGeneratorState();
1363 endFile(ol,true,true);
1364 }
1365 else
1366 {
1367 endFile(ol);
1368 }
1369
1370 ol.popGeneratorState();
1371
1372 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1373 {
1374 m_allMemberList.sort();
1375 writeMemberPages(ol, hierarchyLevel + 1);
1376 }
1377}
1378
1379void GroupDefImpl::writeMemberPages(OutputList &ol, int hierarchyLevel)
1380{
1381 ol.pushGeneratorState();
1383
1384 for (const auto &ml : m_memberLists)
1385 {
1386 if (ml->listType().isDocumentation())
1387 {
1388 ml->writeDocumentationPage(ol,name(),this,hierarchyLevel);
1389 }
1390 }
1391
1392 ol.popGeneratorState();
1393}
1394
1396{
1397 bool createSubDirs=Config_getBool(CREATE_SUBDIRS);
1398
1399 ol.writeString(" <div class=\"navtab\">\n");
1400 ol.writeString(" <table>\n");
1401
1402 for (const auto *md : m_allMemberList)
1403 {
1404 if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
1405 {
1406 if (md->isLinkableInProject())
1407 {
1408 QCString fn = md->getOutputFileBase();
1410 if (md==currentMd) // selected item => highlight
1411 {
1412 ol.writeString(" <tr><td class=\"navtabHL\">");
1413 }
1414 else
1415 {
1416 ol.writeString(" <tr><td class=\"navtab\">");
1417 }
1418 ol.writeString("<span class=\"label\"><a ");
1419 ol.writeString("href=\"");
1420 if (createSubDirs) ol.writeString("../../");
1421 ol.writeString(fn+"#"+md->anchor());
1422 ol.writeString("\">");
1423 ol.writeString(convertToHtml(md->localName()));
1424 ol.writeString("</a></span>");
1425 ol.writeString("</td></tr>\n");
1426 }
1427 }
1428 }
1429 ol.writeString(" </table>\n");
1430 ol.writeString(" </div>\n");
1431}
1432
1433
1434
1435//---- helper functions ------------------------------------------------------
1436
1437void addClassToGroups(const Entry *root,ClassDef *cd)
1438{
1439 for (const Grouping &g : root->groups)
1440 {
1441 GroupDef *gd=nullptr;
1442 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1443 if (gd && gd->addClass(cd))
1444 {
1446 if (cdm)
1447 {
1448 cdm->makePartOfGroup(gd);
1449 }
1450 //printf("Compound %s: in group %s\n",qPrint(cd->name()),gd->groupTitle());
1451 }
1452 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1453 {
1454 warn(root->fileName, root->startLine,
1455 "Found non-existing group '{}' for the command '{}', ignoring command",
1457 );
1458 }
1459 }
1460}
1461
1463{
1464 for (const Grouping &g : root->groups)
1465 {
1467 if (gd && gd->addConcept(cd))
1468 {
1470 if (cdm)
1471 {
1472 cdm->makePartOfGroup(gd);
1473 }
1474 //printf("Compound %s: in group %s\n",qPrint(cd->name()),gd->groupTitle());
1475 }
1476 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1477 {
1478 warn(root->fileName, root->startLine,
1479 "Found non-existing group '{}' for the command '{}', ignoring command",
1481 );
1482 }
1483 }
1484}
1485
1486void addModuleToGroups(const Entry *root,ModuleDef *mod)
1487{
1488 for (const Grouping &g : root->groups)
1489 {
1491 if (gd && gd->addModule(mod))
1492 {
1493 mod->makePartOfGroup(gd);
1494 //printf("Module %s: in group %s\n",qPrint(mod->name()),gd->groupTitle());
1495 }
1496 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1497 {
1498 warn(root->fileName, root->startLine,
1499 "Found non-existing group '{}' for the command '{}', ignoring command",
1501 );
1502 }
1503 }
1504}
1505
1506
1508{
1509 //printf("root->groups.size()=%zu\n",root->groups.size());
1510 for (const Grouping &g : root->groups)
1511 {
1512 GroupDef *gd=nullptr;
1513 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1514 //printf("group '%s' gd=%p\n",qPrint(g.groupname),(void*)gd);
1515 if (gd && gd->addNamespace(nd))
1516 {
1518 if (ndm)
1519 {
1520 ndm->makePartOfGroup(gd);
1521 }
1522 //printf("Namespace %s: in group %s\n",qPrint(nd->name()),qPrint(gd->name()));
1523 }
1524 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1525 {
1526 warn(root->fileName, root->startLine,
1527 "Found non-existing group '{}' for the command '{}', ignoring command",
1529 );
1530 }
1531 }
1532}
1533
1534void addDirToGroups(const Entry *root,DirDef *dd)
1535{
1536 //printf("*** root->groups.size()=%d\n",root->groups.size());
1537 for (const Grouping &g : root->groups)
1538 {
1540 //printf("group '%s'\n",qPrint(g->groupname));
1541 if (gd)
1542 {
1543 gd->addDir(dd);
1544 dd->makePartOfGroup(gd);
1545 //printf("Dir %s: in group %s\n",qPrint(dd->name()),qPrint(g->groupname));
1546 }
1547 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1548 {
1549 warn(root->fileName, root->startLine,
1550 "Found non-existing group '{}' for the command '{}', ignoring command",
1552 );
1553 }
1554 }
1555}
1556
1557void addGroupToGroups(const Entry *root,GroupDef *subGroup)
1558{
1559 //printf("addGroupToGroups for %s groups=%d\n",qPrint(root->name),root->groups.size());
1560 for (const Grouping &g : root->groups)
1561 {
1563 if (gd)
1564 {
1565 if (gd==subGroup)
1566 {
1567 warn(root->fileName,root->startLine,"Refusing to add group {} to itself",
1568 gd->name());
1569 }
1570 else if (subGroup->findGroup(gd))
1571 {
1572 warn(root->fileName,root->startLine,"Refusing to add group {} to group {}, since the latter is already a "
1573 "subgroup of the former", subGroup->name(),gd->name());
1574 }
1575 else if (!gd->findGroup(subGroup))
1576 {
1577 gd->addGroup(subGroup);
1578 subGroup->makePartOfGroup(gd);
1579 }
1580 }
1581 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1582 {
1583 warn(root->fileName, root->startLine,
1584 "Found non-existing group '{}' for the command '{}', ignoring command",
1586 );
1587 }
1588 }
1589}
1590
1591/*! Add a member to the group with the highest priority */
1592void addMemberToGroups(const Entry *root,MemberDef *md)
1593{
1594 //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%zu\n",
1595 // root, qPrint(root->name), md, qPrint(md->name()), root->groups.size() );
1596
1597 // Search entry's group list for group with highest pri.
1599 GroupDef *fgd=nullptr;
1600 for (const Grouping &g : root->groups)
1601 {
1602 GroupDef *gd=nullptr;
1603 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1604 if (gd && g.pri >= pri)
1605 {
1606 if (fgd && gd!=fgd && g.pri==pri)
1607 {
1608 warn(root->fileName, root->startLine,
1609 "Member {} found in multiple {} groups! "
1610 "The member will be put in group {}, and not in group {}",
1611 md->name(), Grouping::getGroupPriName( pri ),
1612 gd->name(), fgd->name()
1613 );
1614 }
1615
1616 fgd = gd;
1617 pri = g.pri;
1618 }
1619 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1620 {
1621 warn(root->fileName, root->startLine,
1622 "Found non-existing group '{}' for the command '{}', ignoring command",
1624 );
1625 }
1626 }
1627 //printf("fgd=%p\n",fgd);
1628
1629 // put member into group defined by this entry?
1630 if (fgd)
1631 {
1632 GroupDef *mgd = md->getGroupDef();
1633 //printf("mgd=%p\n",mgd);
1634 bool insertit = FALSE;
1635 if (mgd==nullptr)
1636 {
1637 insertit = TRUE;
1638 }
1639 else if (mgd!=fgd)
1640 {
1641 bool moveit = FALSE;
1642
1643 // move member from one group to another if
1644 // - the new one has a higher priority
1645 // - the new entry has the same priority, but with docs where the old one had no docs
1646 if (md->getGroupPri()<pri)
1647 {
1648 moveit = TRUE;
1649 }
1650 else
1651 {
1652 if (md->getGroupPri()==pri)
1653 {
1654 if (!root->doc.isEmpty() && !md->getGroupHasDocs())
1655 {
1656 moveit = TRUE;
1657 }
1658 else if (!root->doc.isEmpty() && md->getGroupHasDocs())
1659 {
1661 "Member documentation for {} found several times in {} groups!\n"
1662 "{}:{}: The member will remain in group {}, and won't be put into group {}",
1663 md->name(), Grouping::getGroupPriName( pri ),
1664 root->fileName, root->startLine,
1665 mgd->name(), fgd->name()
1666 );
1667 }
1668 }
1669 }
1670
1671 if (moveit)
1672 {
1673 //printf("removeMember\n");
1674 mgd->removeMember(md);
1675 insertit = TRUE;
1676 }
1677 }
1678
1679 if (insertit)
1680 {
1681 //printf("insertMember found at %s line %d: %s: related %s\n",
1682 // qPrint(md->getDefFileName()),md->getDefLine(),
1683 // qPrint(md->name()),qPrint(root->relates));
1684 bool success = fgd->insertMember(md);
1685 if (success)
1686 {
1688 if (mdm)
1689 {
1690 //printf("insertMember successful\n");
1691 mdm->setGroupDef(fgd,pri,root->fileName,root->startLine,!root->doc.isEmpty());
1693 if (cdm)
1694 {
1695 cdm->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
1696 }
1697 if (mdm->isEnumerate() && mdm->getGroupDef() && md->isStrong())
1698 {
1699 for (const auto &emd : mdm->enumFieldList())
1700 {
1702 if (emdm && emdm->getGroupDef()==nullptr)
1703 {
1704 emdm->setGroupDef(mdm->getGroupDef(),mdm->getGroupPri(),
1705 mdm->getGroupFileName(),mdm->getGroupStartLine(),
1706 mdm->getGroupHasDocs());
1707 }
1708 }
1709 }
1710 }
1711 }
1712 }
1713 }
1714}
1715
1716
1717void addExampleToGroups(const Entry *root,PageDef *eg)
1718{
1719 for (const Grouping &g : root->groups)
1720 {
1722 if (gd)
1723 {
1724 gd->addExample(eg);
1725 eg->makePartOfGroup(gd);
1726 //printf("Example %s: in group %s\n",qPrint(eg->name()),s->data());
1727 }
1728 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1729 {
1730 warn(root->fileName, root->startLine,
1731 "Found non-existing group '{}' for the command '{}', ignoring command",
1733 );
1734 }
1735 }
1736}
1737
1739{
1740 return m_fileName;
1741}
1742
1744{
1745 {
1746 const RefItemVector &xrefItems = xrefListItems();
1747 addRefItem(xrefItems,
1749 theTranslator->trGroup(TRUE,TRUE),
1751 QCString(),
1752 nullptr
1753 );
1754 }
1755 for (const auto &mg : m_memberGroups)
1756 {
1757 mg->addListReferences(this);
1758 }
1759 for (auto &ml : m_memberLists)
1760 {
1761 if (ml->listType().isDocumentation())
1762 {
1763 ml->addListReferences(this);
1764 }
1765 }
1766}
1767
1769{
1770 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
1771 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
1772 const auto &ml = m_memberLists.get(lt,MemberListContainer::Group);
1773 ml->setNeedsSorting(
1774 (ml->listType().isDeclaration() && sortBriefDocs) ||
1775 (ml->listType().isDocumentation() && sortMemberDocs));
1776 ml->push_back(md);
1777}
1778
1779// performs a partial reordering to group elements together with the same scope
1780template<class Vec>
1781static void groupClassesWithSameScope(Vec &vec)
1782{
1783 bool done=false;
1784 while (!done) // for each iteration
1785 {
1786 done=true;
1787 for (size_t i=0; i<vec.size(); i++) // go through all items
1788 {
1789 std::string qni = vec[i]->name().str();
1790 size_t posi = qni.rfind("::");
1791 if (posi!=std::string::npos)
1792 {
1793 std::string scope = qni.substr(0,posi);
1794 auto it = std::find_if( vec.begin(), vec.end(),
1795 [&](typename Vec::Ptr &cd)
1796 { return cd->name().str()==scope; });
1797 if (it!=vec.end())
1798 {
1799 size_t idx = std::distance(vec.begin(),it);
1800 if (i<idx) // parent scope located after child scope
1801 {
1802 // to avoid reordering elements with the same parent
1803 // we skip to the last one with the same scope
1804 size_t k = idx;
1805 while (k<vec.size() && vec[k]->name().str().substr(0,posi)==scope)
1806 {
1807 idx = k;
1808 k++;
1809 }
1810 // swap the items such that i is inserted after idx
1811 for (size_t j=i; j<idx; j++)
1812 {
1813 std::swap(vec[j],vec[j+1]);
1814 }
1815 done=false;
1816 }
1817 else if (idx<i && vec[i-1]->name().str().substr(0,posi)!=scope)
1818 {
1819 // parent scope is found before the item, and the item
1820 // has some other item with a different scope in front of it
1821 // move idx to the end of range with the same scope
1822 while (idx<i && vec[idx]->name().str().substr(0,posi)==scope)
1823 {
1824 idx++;
1825 }
1826 // swap the items such that i is just after idx
1827 for (size_t j=idx; j<i; j++)
1828 {
1829 std::swap(vec[j],vec[j+1]);
1830 }
1831 done=false;
1832 }
1833 }
1834 }
1835 }
1836 }
1837}
1838
1840{
1841 for (auto &ml : m_memberLists)
1842 {
1843 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
1844 }
1845 if (Config_getBool(SORT_BRIEF_DOCS))
1846 {
1847 std::stable_sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
1848
1849 auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
1850 {
1851 return Config_getBool(SORT_BY_SCOPE_NAME) ?
1852 qstricmp_sort(c1->name(), c2->name())<0 :
1853 qstricmp_sort(c1->className(), c2->className())<0;
1854 };
1855 std::stable_sort(m_classes.begin(), m_classes.end(), classComp);
1856
1857 auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
1858 {
1859 return qstricmp_sort(n1->name(),n2->name())<0;
1860 };
1861
1862 std::stable_sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
1863 }
1864 else
1865 {
1868 }
1869}
1870
1872{
1873 for (auto &ml : m_memberLists)
1874 {
1875 if (ml->listType()==lt)
1876 {
1877 return ml.get();
1878 }
1879 }
1880 return nullptr;
1881}
1882
1884{
1885 bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1886
1887 MemberList * ml = getMemberList(lt);
1888 if (optimizeVhdl && ml)
1889 {
1890 VhdlDocGen::writeVhdlDeclarations(ml,ol,this,nullptr,nullptr,nullptr,nullptr);
1891 return;
1892 }
1893 if (ml)
1894 {
1895 ml->writeDeclarations(ol,nullptr,nullptr,nullptr,this,nullptr,title,QCString());
1896 }
1897}
1898
1900{
1901 MemberList * ml = getMemberList(lt);
1902 if (ml) ml->writeDocumentation(ol,name(),this,title,ml->listType().toLabel());
1903}
1904
1906{
1907 MemberList *ml = getMemberList(lt);
1908 if (ml) ml->remove(md);
1909}
1910
1912{
1913 std::stable_sort(m_groups.begin(),
1914 m_groups.end(),
1915 [](const auto &g1,const auto &g2)
1916 { return g1->groupTitle() < g2->groupTitle(); });
1917}
1918
1919static bool hasNonReferenceNestedGroupRec(const GroupDef *gd,int level)
1920{
1921 if (level>30)
1922 {
1923 err("Possible recursive group relation while inside {}\n",gd->name());
1924 return false;
1925 }
1926 bool found=gd->isLinkableInProject();
1927 if (found)
1928 {
1929 return true;
1930 }
1931 else
1932 {
1933 for (const auto &igd : gd->getSubGroups())
1934 {
1935 found = found || hasNonReferenceNestedGroupRec(igd,level+1);
1936 if (found) break;
1937 }
1938 }
1939 return found;
1940}
1941
1943{
1944 bool allExternals = Config_getBool(EXTERNAL_GROUPS);
1945 return (allExternals || hasNonReferenceNestedGroupRec(this,0)) && isLinkable();
1946}
1947
1949{
1950 return !isReference() && isLinkable();
1951}
1952
1954{
1955 return hasUserDocumentation();
1956}
1957
1958// let the "programming language" for a group depend on what is inserted into it.
1959// First item that has an associated languages determines the language for the whole group.
1961{
1962 if (getLanguage()==SrcLangExt::Unknown && d->getLanguage()!=SrcLangExt::Unknown)
1963 {
1965 }
1966}
1967
1969{
1970 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
1971 return ((!briefDescription().isEmpty() && repeatBrief) ||
1972 !documentation().isEmpty() ||
1973 !inbodyDocumentation().isEmpty()) &&
1974 (m_pages.size()!=numDocMembers());
1975}
1976
1978{
1980}
1981
1983{
1984 return m_hasGroupGraph;
1985}
1986
1987// --- Cast functions
1988
1990{
1991 if (d==nullptr) return nullptr;
1992 if (d && typeid(*d)==typeid(GroupDefImpl))
1993 {
1994 return static_cast<GroupDef*>(d);
1995 }
1996 else
1997 {
1998 return nullptr;
1999 }
2000}
2001
2003{
2004 if (d==nullptr) return nullptr;
2005 if (d && typeid(*d)==typeid(GroupDefImpl))
2006 {
2007 return static_cast<const GroupDef*>(d);
2008 }
2009 else
2010 {
2011 return nullptr;
2012 }
2013}
2014
2015
This class represents an function or template argument list.
Definition arguments.h:65
size_t size() const
Definition arguments.h:100
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.
virtual void setGroupDefForAllMembers(GroupDef *g, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs)=0
The common base class of all entity definitions found in the sources.
Definition definition.h:76
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual DefType definitionType() const =0
virtual bool isLinkableInProject() const =0
virtual bool isHidden() const =0
virtual const GroupList & partOfGroups() const =0
virtual Definition * getOuterScope() const =0
virtual const QCString & name() const =0
bool isReference() const override
const QCString & name() const override
bool hasUserDocumentation() const override
QCString inbodyFile() const override
bool hasBriefDescription() const override
QCString docFile() const override
QCString briefFile() const override
QCString qualifiedName() const override
void setLanguage(SrcLangExt lang) override
const RefItemVector & xrefListItems() const override
QCString briefDescription(bool abbreviate=FALSE) const override
DefinitionMixin(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=TRUE)
const GroupList & partOfGroups() const override
QCString inbodyDocumentation() const override
int docLine() const override
int inbodyLine() const override
int briefLine() const override
QCString documentation() const override
void writeDocAnchorsToTagFile(TextStream &fs) const override
SrcLangExt getLanguage() const override
virtual void makePartOfGroup(GroupDef *gd)=0
A model of a directory symbol.
Definition dirdef.h:110
A list of directories.
Definition dirdef.h:177
Representation of a group collaboration graph.
static bool suppressDocWarnings
Definition doxygen.h:132
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:114
Represents an unstructured piece of information, about an entity found in the sources.
Definition entry.h:116
QCString fileName
file this entry was extracted from
Definition entry.h:223
std::vector< Grouping > groups
list of groups this entry belongs to
Definition entry.h:221
int startLine
start line of entry in the source
Definition entry.h:224
QCString doc
documentation block (partly parsed)
Definition entry.h:200
A model of a file symbol.
Definition filedef.h:99
A model of a group of symbols.
Definition groupdef.h:52
virtual void addDir(DirDef *dd)=0
virtual void addExample(PageDef *def)=0
virtual const GroupList & getSubGroups() const =0
virtual bool addClass(ClassDef *def)=0
virtual bool addModule(ModuleDef *def)=0
virtual void removeMember(MemberDef *md)=0
virtual bool addNamespace(NamespaceDef *def)=0
virtual void addGroup(GroupDef *def)=0
virtual bool insertMember(MemberDef *def, bool docOnly=FALSE)=0
virtual bool findGroup(const GroupDef *def) const =0
virtual bool addConcept(ConceptDef *def)=0
ConceptLinkedRefMap m_concepts
Definition groupdef.cpp:158
FileList m_fileList
Definition groupdef.cpp:156
const ModuleLinkedRefMap & getModules() const override
Definition groupdef.cpp:113
void endMemberDeclarations(OutputList &ol)
void startMemberDocumentation(OutputList &ol)
void setGroupScope(Definition *d) override
Definition groupdef.cpp:101
bool isLinkable() const override
bool addNamespace(NamespaceDef *def) override
Definition groupdef.cpp:313
Definition * getGroupScope() const override
Definition groupdef.cpp:102
bool hasGroupTitle() const override
Definition groupdef.cpp:67
QCString groupTitle() const override
Definition groupdef.cpp:65
QCString anchor() const override
Definition groupdef.cpp:63
void removeMemberFromList(MemberListType lt, MemberDef *md)
bool hasGroupGraph() const override
void writeSummaryLinks(OutputList &ol) const override
void startMemberDeclarations(OutputList &ol)
void writeNamespaces(OutputList &ol, const QCString &title)
Definition groupdef.cpp:939
bool findGroup(const GroupDef *def) const override
Definition groupdef.cpp:586
void writeDirs(OutputList &ol, const QCString &title)
Definition groupdef.cpp:985
~GroupDefImpl() override
Definition groupdef.cpp:204
QCString displayName(bool=TRUE) const override
Definition groupdef.cpp:64
void sortMemberLists() override
NamespaceLinkedRefMap m_namespaces
Definition groupdef.cpp:160
void writeInlineClasses(OutputList &ol)
CodeSymbolType codeSymbolType() const override
Definition groupdef.cpp:61
const MemberGroupList & getMemberGroups() const override
Definition groupdef.cpp:108
void removeMember(MemberDef *md) override
Definition groupdef.cpp:512
void setGroupTitleLocal(const QCString &title)
Definition groupdef.cpp:208
void addPage(PageDef *def) override
Definition groupdef.cpp:332
void writeMemberDeclarations(OutputList &ol, MemberListType lt, const QCString &title)
void writeModules(OutputList &ol, const QCString &title)
MemberList * getMemberList(MemberListType lt) const override
bool isASubGroup() const override
Definition groupdef.cpp:611
bool subGrouping() const override
Definition groupdef.cpp:99
ModuleLinkedRefMap m_modules
Definition groupdef.cpp:159
GroupDefImpl(const QCString &fileName, int line, const QCString &name, const QCString &title, const QCString &refFileName=QCString())
Definition groupdef.cpp:184
void addGroup(GroupDef *def) override
Definition groupdef.cpp:602
void addDir(DirDef *dd) override
Definition groupdef.cpp:326
MemberGroupList m_memberGroups
Definition groupdef.cpp:169
bool addModule(ModuleDef *def) override
Definition groupdef.cpp:301
void addMembersToMemberGroup() override
Definition groupdef.cpp:347
PageLinkedRefMap m_examples
Definition groupdef.cpp:163
void writeTagFile(TextStream &) override
Definition groupdef.cpp:648
MemberList m_allMemberList
Definition groupdef.cpp:165
void writeGroupGraph(OutputList &ol)
Definition groupdef.cpp:881
bool isVisibleInHierarchy() const override
void writeAuthorSection(OutputList &ol)
void endMemberDocumentation(OutputList &ol)
DirList m_dirList
Definition groupdef.cpp:164
void sortSubGroups() override
QCString m_fileName
Definition groupdef.cpp:155
bool m_subGrouping
Definition groupdef.cpp:170
bool addClass(ClassDef *def) override
Definition groupdef.cpp:276
GroupList m_groups
Definition groupdef.cpp:161
void updateLanguage(const Definition *)
void findSectionsInDocumentation() override
Definition groupdef.cpp:237
const GroupList & getSubGroups() const override
Definition groupdef.cpp:115
bool insertMember(MemberDef *def, bool docOnly=FALSE) override
Definition groupdef.cpp:359
const DirList & getDirs() const override
Definition groupdef.cpp:117
void addMemberListToGroup(MemberList *, bool(MemberDef::*)() const)
const PageLinkedRefMap & getExamples() const override
Definition groupdef.cpp:118
void addFile(FileDef *def) override
Definition groupdef.cpp:257
bool hasDetailedDescription() const override
void overrideGroupGraph(bool e) override
const FileList & getFiles() const override
Definition groupdef.cpp:110
void writePageDocumentation(OutputList &ol)
const NamespaceLinkedRefMap & getNamespaces() const override
Definition groupdef.cpp:114
const PageLinkedRefMap & getPages() const override
Definition groupdef.cpp:116
void writeMemberGroups(OutputList &ol)
Definition * m_groupScope
Definition groupdef.cpp:167
ClassLinkedRefMap m_classes
Definition groupdef.cpp:157
void writeMemberPages(OutputList &ol, int hierarchyLevel) override
const MemberLists & getMemberLists() const override
Definition groupdef.cpp:105
QCString getOutputFileBase() const override
const ClassLinkedRefMap & getClasses() const override
Definition groupdef.cpp:111
void writePageNavigation(OutputList &ol) const override
bool m_hasGroupGraph
Definition groupdef.cpp:171
MemberNameInfoLinkedMap m_allMemberNameInfoLinkedMap
Definition groupdef.cpp:166
void writeFiles(OutputList &ol, const QCString &title)
Definition groupdef.cpp:906
void writeMemberDocumentation(OutputList &ol, MemberListType lt, const QCString &title)
void writeConcepts(OutputList &ol, const QCString &title)
bool addConcept(ConceptDef *def) override
Definition groupdef.cpp:289
DefType definitionType() const override
Definition groupdef.cpp:60
void writeNestedGroups(OutputList &ol, const QCString &title)
Definition groupdef.cpp:945
void writeDetailedDescription(OutputList &ol, const QCString &title)
Definition groupdef.cpp:782
void distributeMemberGroupDocumentation() override
Definition groupdef.cpp:229
void computeAnchors() override
Definition groupdef.cpp:642
void writeQuickMemberLinks(OutputList &ol, const MemberDef *currentMd) const override
void addListReferences() override
QCString m_title
Definition groupdef.cpp:153
bool containsFile(const FileDef *def) const override
Definition groupdef.cpp:271
PageLinkedRefMap m_pages
Definition groupdef.cpp:162
void countMembers() override
Definition groupdef.cpp:616
bool isLinkableInProject() const override
MemberLists m_memberLists
Definition groupdef.cpp:168
size_t numDocMembers() const override
Definition groupdef.cpp:630
void addMemberToList(MemberListType lt, MemberDef *md)
const ConceptLinkedRefMap & getConcepts() const override
Definition groupdef.cpp:112
void writeDocumentation(OutputList &ol) override
void setGroupTitle(const QCString &newtitle) override
Definition groupdef.cpp:223
void writeBriefDescription(OutputList &ol)
Definition groupdef.cpp:845
void addExample(PageDef *def) override
Definition groupdef.cpp:340
void writeClasses(OutputList &ol, const QCString &title)
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 bool getGroupHasDocs() const =0
virtual const ClassDef * getClassDef() const =0
virtual const MemberDef * getGroupAlias() const =0
virtual const ArgumentList & templateArguments() const =0
virtual GroupDef * getGroupDef()=0
virtual const MemberVector & enumFieldList() const =0
virtual const FileDef * getFileDef() const =0
virtual const ArgumentList & argumentList() const =0
virtual int getGroupStartLine() const =0
virtual bool isFunction() const =0
virtual ClassDef * getClassDefOfAnonymousType() const =0
virtual Grouping::GroupPri_t getGroupPri() const =0
virtual Protection protection() const =0
virtual bool isEnumerate() const =0
virtual MemberType memberType() const =0
virtual QCString memberTypeName() const =0
virtual QCString getGroupFileName() const =0
virtual bool isStrong() const =0
virtual Specifier virtualness(int count=0) const =0
virtual void setGroupAlias(const MemberDef *md)=0
virtual void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr)=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, const QCString &anchor, 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
void push_back(Ptr &&p)
Definition membername.h:141
void remove(const MemberDef *md)
Definition memberlist.h:84
An abstract interface of a namespace symbol.
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:673
void writeString(const QCString &text)
Definition outputlist.h:412
void startMemberDeclaration()
Definition outputlist.h:570
void endTitleHead(const QCString &fileName, const QCString &name)
Definition outputlist.h:406
void endSection(const QCString &lab, SectionType t)
Definition outputlist.h:589
void disable(OutputType o)
void startTitleHead(const QCString &fileName)
Definition outputlist.h:404
void writeRuler()
Definition outputlist.h:522
void endGroupCollaboration(DotGroupCollaboration &g)
Definition outputlist.h:667
void startGroupHeader(const QCString &id=QCString(), int extraLevels=0)
Definition outputlist.h:454
void enable(OutputType o)
void endContents()
Definition outputlist.h:621
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 startGroupCollaboration()
Definition outputlist.h:665
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:671
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 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 endGroupHeader(int extraLevels=0)
Definition outputlist.h:456
void writePageOutline()
Definition outputlist.h:617
void startContents()
Definition outputlist.h:619
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:572
void writePageLink(const QCString &name, bool first)
Definition outputlist.h:390
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 startSection(const QCString &lab, const QCString &title, SectionType t)
Definition outputlist.h:587
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
A model of a page symbol.
Definition pagedef.h:26
This is an alternative implementation of QCString.
Definition qcstring.h:101
QCString & prepend(const char *s)
Definition qcstring.h:407
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
class that provide information about a section.
Definition section.h:57
QCString label() const
Definition section.h:68
QCString title() const
Definition section.h:69
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:175
static constexpr int Subsection
Definition section.h:34
Text streaming class that buffers data.
Definition textstream.h:36
static void writeVhdlDeclarations(const MemberList *, OutputList &, const GroupDef *, const ClassDef *, const FileDef *, const NamespaceDef *, const ModuleDef *)
ClassDefMutable * toClassDefMutable(Definition *d)
ConceptDefMutable * toConceptDefMutable(Definition *d)
#define Config_getInt(name)
Definition config.h:34
#define Config_getBool(name)
Definition config.h:33
#define Config_getString(name)
Definition config.h:32
#define NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
bool compareDirDefs(const DirDef *item1, const DirDef *item2)
Definition dirdef.cpp:1193
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()
void addNamespaceToGroups(const Entry *root, NamespaceDef *nd)
void addGroupToGroups(const Entry *root, GroupDef *subGroup)
void addClassToGroups(const Entry *root, ClassDef *cd)
void addDirToGroups(const Entry *root, DirDef *dd)
static void groupClassesWithSameScope(Vec &vec)
void addModuleToGroups(const Entry *root, ModuleDef *mod)
std::unique_ptr< GroupDef > createGroupDef(const QCString &fileName, int line, const QCString &name, const QCString &title, const QCString &refFileName)
Definition groupdef.cpp:175
GroupDef * toGroupDef(Definition *d)
void addConceptToGroups(const Entry *root, ConceptDef *cd)
static bool hasNonReferenceNestedGroupRec(const GroupDef *gd, int level)
void addExampleToGroups(const Entry *root, PageDef *eg)
void addMemberToGroups(const Entry *root, MemberDef *md)
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
Definition index.cpp:427
void startFile(OutputList &ol, const QCString &name, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel, const QCString &allMembersFile)
Definition index.cpp:401
Translator * theTranslator
Definition language.cpp:71
MemberDefMutable * toMemberDefMutable(Definition *d)
#define warn_uncond(fmt,...)
Definition message.h:122
#define warn(file, line, fmt,...)
Definition message.h:97
#define msg(fmt,...)
Definition message.h:94
#define err(fmt,...)
Definition message.h:127
NamespaceDefMutable * toNamespaceDefMutable(Definition *d)
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
std::vector< RefItem * > RefItemVector
Definition reflist.h:133
Web server based search engine.
Grouping info.
Definition types.h:227
QCString groupname
name of the group
Definition types.h:257
GroupPri_t
Grouping priority.
Definition types.h:230
@ GROUPING_LOWEST
Definition types.h:231
@ GROUPING_INGROUP
membership in group was defined by @ingroup
Definition types.h:236
static const char * getGroupPriName(GroupPri_t priority)
Definition types.h:240
GroupPri_t pri
priority of this definition
Definition types.h:258
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
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
CodeSymbolType
Definition types.h:481
@ Enumeration
Definition types.h:557
@ EnumValue
Definition types.h:558
@ Variable
Definition types.h:555
@ Property
Definition types.h:563
@ Typedef
Definition types.h:556
@ Function
Definition types.h:554
MemberListContainer
Definition types.h:472
SrcLangExt
Definition types.h:207
QCString convertToHtml(const QCString &s, bool keepEntities)
Definition util.cpp:4479
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:5318
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:5405
bool found
Definition util.cpp:984
void createSubDirs(const Dir &d)
Definition util.cpp:4156
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
Definition util.cpp:1958
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:4428
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:5415
A bunch of utility functions.