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 briefLine(),
814 this,
815 nullptr,
817 DocOptions());
818 }
819 // write separator between brief and details
820 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
821 !documentation().isEmpty())
822 {
826 ol.enableAll();
829 ol.writeString("\n\n");
831 }
832
833 // write detailed documentation
834 if (!documentation().isEmpty())
835 {
836 ol.generateDoc(docFile(),
837 docLine(),
838 this,
839 nullptr,
840 documentation()+"\n",
841 DocOptions()
842 .setIndexWords(true));
843 }
844
845 // write inbody documentation
846 if (!inbodyDocumentation().isEmpty())
847 {
849 inbodyLine(),
850 this,
851 nullptr,
852 inbodyDocumentation()+"\n",
853 DocOptions()
854 .setIndexWords(true));
855 }
856 }
857}
858
860{
862 {
863 auto parser { createDocParser() };
864 auto ast { validatingParseDoc(*parser.get(),
865 briefFile(),
866 briefLine(),
867 this,
868 nullptr,
870 DocOptions()
871 .setIndexWords(true)
872 .setSingleLine(true))
873 };
874 if (!ast->isEmpty())
875 {
876 ol.startParagraph();
879 ol.writeString(" - ");
881 ol.writeDoc(ast.get(),this,nullptr);
884 ol.writeString(" \n");
886
888 {
890 ol.startTextLink(QCString(),"details");
891 ol.parseText(theTranslator->trMore());
892 ol.endTextLink();
893 }
895 ol.endParagraph();
896 }
897 }
898 ol.writeSynopsis();
899}
900
902{
903 if (Config_getBool(HAVE_DOT) && m_hasGroupGraph /*&& Config_getBool(GROUP_GRAPHS)*/)
904 {
905 DotGroupCollaboration graph(this);
906 if (graph.isTooBig())
907 {
908 warn_uncond("Group dependency graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
909 name(), graph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
910 }
911 else if (!graph.isTrivial())
912 {
913 msg("Generating dependency graph for group {}\n",qualifiedName());
916 //ol.startParagraph();
918 ol.parseText(theTranslator->trCollaborationDiagram(m_title));
919 ol.endGroupCollaboration(graph);
920 //ol.endParagraph();
922 }
923 }
924}
925
927{
928 // write list of files
929 if (!m_fileList.empty())
930 {
931 ol.startMemberHeader("files");
932 ol.parseText(title);
933 ol.endMemberHeader();
934 ol.startMemberList();
935 for (const auto &fd : m_fileList)
936 {
937 if (!fd->hasDocumentation()) continue;
939 QCString anc = fd->anchor();
940 if (anc.isEmpty()) anc=fd->displayName(); else anc.prepend(fd->displayName()+"_");
942 ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
944 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),QCString(),fd->displayName());
946 if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
947 {
948 ol.startMemberDescription(fd->getOutputFileBase());
950 briefLine(),
951 fd,
952 nullptr,
953 fd->briefDescription(),
954 DocOptions()
955 .setSingleLine(true));
957 }
959 }
960 ol.endMemberList();
961 }
962}
963
965{
966 // write list of namespaces
967 m_namespaces.writeDeclaration(ol,title);
968}
969
971{
972 // write list of groups
973 int count=0;
974 for (const auto &gd : m_groups)
975 {
976 if (gd->isVisible()) count++;
977 }
978 if (count>0)
979 {
980 ol.startMemberHeader("groups");
981 ol.parseText(title);
982 ol.endMemberHeader();
983 ol.startMemberList();
984 for (const auto &gd : m_groups)
985 {
986 if (gd->isVisible())
987 {
988 if (!gd->hasDocumentation()) continue;
990 QCString anc = gd->anchor();
991 if (anc.isEmpty()) anc=gd->name(); else anc.prepend(gd->name()+"_");
994 ol.startIndexItem(gd->getReference(),gd->getOutputFileBase());
995 ol.generateDoc(gd->getDefFileName(),
996 gd->getDefLine(),
997 gd,
998 nullptr,
999 gd->groupTitle(),
1000 DocOptions()
1001 .setSingleLine(true)
1002 .setAutolinkSupport(false));
1003 ol.endIndexItem(gd->getReference(),gd->getOutputFileBase());
1005 if (!gd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
1006 {
1007 ol.startMemberDescription(gd->getOutputFileBase());
1009 briefLine(),
1010 gd,
1011 nullptr,
1012 gd->briefDescription(),
1013 DocOptions()
1014 .setSingleLine(true));
1016 }
1018 }
1019 }
1020 ol.endMemberList();
1021 }
1022}
1023
1025{
1026 // write list of directories
1027 if (!m_dirList.empty())
1028 {
1029 ol.startMemberHeader("dirs");
1030 ol.parseText(title);
1031 ol.endMemberHeader();
1032 ol.startMemberList();
1033 for(const auto dd : m_dirList)
1034 {
1035 if (!dd->hasDocumentation()) continue;
1037 QCString anc = dd->anchor();
1038 if (anc.isEmpty()) anc=dd->shortName(); else anc.prepend(dd->shortName()+"_");
1040 ol.parseText(theTranslator->trDir(FALSE,TRUE));
1041 ol.insertMemberAlign();
1042 ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),QCString(),dd->shortName());
1044 if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
1045 {
1046 ol.startMemberDescription(dd->getOutputFileBase());
1048 briefLine(),
1049 dd,
1050 nullptr,
1051 dd->briefDescription(),
1052 DocOptions()
1053 .setSingleLine(true));
1055 }
1057 }
1058
1059 ol.endMemberList();
1060 }
1061}
1062
1064{
1065 // write list of classes
1066 m_classes.writeDeclaration(ol,nullptr,title,FALSE);
1067}
1068
1070{
1071 // write list of concepts
1072 m_concepts.writeDeclaration(ol,title,FALSE);
1073}
1074
1076{
1077 // write list of modules
1078 m_modules.writeDeclaration(ol,title,FALSE);
1079}
1080
1081
1083{
1084 m_classes.writeDocumentation(ol);
1085}
1086
1088{
1089 for (const auto *pd : m_pages)
1090 {
1091 if (!pd->isReference())
1092 {
1093 const SectionInfo *si=nullptr;
1094 if (pd->hasTitle() && !pd->name().isEmpty() &&
1095 (si=SectionManager::instance().find(pd->name()))!=nullptr)
1096 {
1098 ol.docify(si->title());
1100 }
1101 ol.startTextBlock();
1102 ol.generateDoc(pd->docFile(),
1103 pd->docLine(),
1104 pd,
1105 nullptr,
1106 (pd->documentation()+pd->inbodyDocumentation()),
1107 DocOptions()
1108 .setIndexWords(true));
1109 ol.endTextBlock();
1110 }
1111 }
1112}
1113
1115{
1116 /* write user defined member groups */
1117 for (const auto &mg : m_memberGroups)
1118 {
1119 mg->writeDeclarations(ol,nullptr,nullptr,nullptr,this,nullptr);
1120 }
1121}
1122
1127
1132
1134{
1135 //printf("** GroupDefImpl::startMemberDocumentation()\n");
1136 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1137 {
1138 ol.pushGeneratorState();
1141 }
1142}
1143
1145{
1146 //printf("** GroupDefImpl::endMemberDocumentation()\n");
1147 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1148 {
1149 ol.popGeneratorState();
1151 }
1152}
1153
1155{
1156 // write Author section (Man only)
1157 ol.pushGeneratorState();
1159 ol.startGroupHeader();
1160 ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
1161 ol.endGroupHeader();
1162 ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString(PROJECT_NAME)));
1163 ol.popGeneratorState();
1164}
1165
1167{
1168 ol.pushGeneratorState();
1170 bool first=TRUE;
1171 SrcLangExt lang = getLanguage();
1172 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1173 {
1174 if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classes.declVisible()) ||
1175 (lde->kind()==LayoutDocEntry::GroupConcepts && m_concepts.declVisible()) ||
1176 (lde->kind()==LayoutDocEntry::GroupModules && m_modules.declVisible()) ||
1177 (lde->kind()==LayoutDocEntry::GroupNamespaces && m_namespaces.declVisible(false)) ||
1178 (lde->kind()==LayoutDocEntry::GroupFiles && !m_fileList.empty()) ||
1179 (lde->kind()==LayoutDocEntry::GroupNestedGroups && !m_groups.empty()) ||
1180 (lde->kind()==LayoutDocEntry::GroupDirs && !m_dirList.empty())
1181 )
1182 {
1183 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1184 if (ls)
1185 {
1186 QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
1187 lde->kind()==LayoutDocEntry::GroupConcepts ? "concepts" :
1188 lde->kind()==LayoutDocEntry::GroupModules ? "modules" :
1189 lde->kind()==LayoutDocEntry::GroupNamespaces ? "namespaces" :
1190 lde->kind()==LayoutDocEntry::GroupFiles ? "files" :
1191 lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" :
1192 "dirs";
1193 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
1194 first=FALSE;
1195 }
1196 }
1197 else if (lde->kind()==LayoutDocEntry::MemberDecl)
1198 {
1199 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1200 if (lmd)
1201 {
1202 MemberList * ml = getMemberList(lmd->type);
1203 if (ml && ml->declVisible())
1204 {
1205 ol.writeSummaryLink(QCString(),ml->listType().toLabel(),lmd->title(lang),first);
1206 first=FALSE;
1207 }
1208 }
1209 }
1210 }
1211 if (!first)
1212 {
1213 ol.writeString(" </div>\n");
1214 }
1215 ol.popGeneratorState();
1216}
1217
1222
1224{
1225 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
1226 ol.pushGeneratorState();
1227
1228 // Find out how deep this group is nested. In case of multiple parents, use the first one.
1229 int hierarchyLevel = 0;
1230 const GroupDef *gd = this;
1231 while (!gd->partOfGroups().empty())
1232 {
1233 gd = gd->partOfGroups().front();
1234 ++hierarchyLevel;
1235 }
1236
1238 FALSE /* additionalIndices*/, QCString() /*altSidebarName*/, hierarchyLevel);
1239
1240 ol.startHeaderSection();
1241 bool writeOutlinePanel = generateTreeView && Config_getBool(PAGE_OUTLINE_PANEL);
1242 if (!writeOutlinePanel) writeSummaryLinks(ol);
1244 //1.{
1245 ol.pushGeneratorState();
1247 ol.generateDoc(docFile(),
1249 this,
1250 nullptr,
1251 m_title,
1252 DocOptions()
1253 .setIndexWords(true)
1254 .setSingleLine(true)
1255 .setAutolinkSupport(false));
1256 ol.popGeneratorState();
1257 //1.}
1258 addGroupListToTitle(ol,this);
1259 //2.{
1260 ol.pushGeneratorState();
1263 ol.popGeneratorState();
1264 //2.}
1265 //3.{
1266 ol.pushGeneratorState();
1269 if (!m_title.isEmpty())
1270 {
1271 ol.writeString(" - ");
1272 ol.parseText(m_title);
1273 }
1274 ol.popGeneratorState();
1275 //3.}
1276 ol.endHeaderSection();
1277 ol.startContents();
1278
1279 //---------------------------------------- start flexible part -------------------------------
1280
1281 SrcLangExt lang=getLanguage();
1282 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1283 {
1284 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1285 switch (lde->kind())
1286 {
1287 case LayoutDocEntry::BriefDesc:
1289 break;
1290 case LayoutDocEntry::MemberDeclStart:
1292 break;
1293 case LayoutDocEntry::GroupClasses:
1294 if (ls) writeClasses(ol,ls->title(lang));
1295 break;
1296 case LayoutDocEntry::GroupConcepts:
1297 if (ls) writeConcepts(ol,ls->title(lang));
1298 break;
1299 case LayoutDocEntry::GroupModules:
1300 if (ls) writeModules(ol,ls->title(lang));
1301 break;
1302 case LayoutDocEntry::GroupInlineClasses:
1304 break;
1305 case LayoutDocEntry::GroupNamespaces:
1306 if (ls) writeNamespaces(ol,ls->title(lang));
1307 break;
1308 case LayoutDocEntry::MemberGroups:
1310 break;
1311 case LayoutDocEntry::MemberDecl:
1312 {
1313 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1314 if (lmd)
1315 {
1316 writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
1317 }
1318 }
1319 break;
1320 case LayoutDocEntry::MemberDeclEnd:
1322 break;
1323 case LayoutDocEntry::DetailedDesc:
1324 if (ls) writeDetailedDescription(ol,ls->title(lang));
1325 break;
1326 case LayoutDocEntry::MemberDefStart:
1328 break;
1329 case LayoutDocEntry::MemberDef:
1330 {
1331 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
1332 if (lmd)
1333 {
1334 writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
1335 }
1336 }
1337 break;
1338 case LayoutDocEntry::MemberDefEnd:
1340 break;
1341 case LayoutDocEntry::GroupNestedGroups:
1342 if (ls) writeNestedGroups(ol,ls->title(lang));
1343 break;
1344 case LayoutDocEntry::GroupPageDocs:
1346 break;
1347 case LayoutDocEntry::GroupDirs:
1348 if (ls) writeDirs(ol,ls->title(lang));
1349 break;
1350 case LayoutDocEntry::GroupFiles:
1351 if (ls) writeFiles(ol,ls->title(lang));
1352 break;
1353 case LayoutDocEntry::GroupGraph:
1354 writeGroupGraph(ol);
1355 break;
1356 case LayoutDocEntry::AuthorSection:
1358 break;
1359 case LayoutDocEntry::ClassIncludes:
1360 case LayoutDocEntry::ClassInheritanceGraph:
1361 case LayoutDocEntry::ClassNestedClasses:
1362 case LayoutDocEntry::ClassCollaborationGraph:
1363 case LayoutDocEntry::ClassAllMembersLink:
1364 case LayoutDocEntry::ClassUsedFiles:
1365 case LayoutDocEntry::ClassInlineClasses:
1366 case LayoutDocEntry::NamespaceNestedNamespaces:
1367 case LayoutDocEntry::NamespaceNestedConstantGroups:
1368 case LayoutDocEntry::NamespaceClasses:
1369 case LayoutDocEntry::NamespaceConcepts:
1370 case LayoutDocEntry::NamespaceInterfaces:
1371 case LayoutDocEntry::NamespaceStructs:
1372 case LayoutDocEntry::NamespaceExceptions:
1373 case LayoutDocEntry::NamespaceInlineClasses:
1374 case LayoutDocEntry::ConceptDefinition:
1375 case LayoutDocEntry::FileClasses:
1376 case LayoutDocEntry::FileConcepts:
1377 case LayoutDocEntry::FileInterfaces:
1378 case LayoutDocEntry::FileStructs:
1379 case LayoutDocEntry::FileExceptions:
1380 case LayoutDocEntry::FileNamespaces:
1381 case LayoutDocEntry::FileConstantGroups:
1382 case LayoutDocEntry::FileIncludes:
1383 case LayoutDocEntry::FileIncludeGraph:
1384 case LayoutDocEntry::FileIncludedByGraph:
1385 case LayoutDocEntry::FileSourceLink:
1386 case LayoutDocEntry::FileInlineClasses:
1387 case LayoutDocEntry::ModuleExports:
1388 case LayoutDocEntry::ModuleClasses:
1389 case LayoutDocEntry::ModuleConcepts:
1390 case LayoutDocEntry::ModuleUsedFiles:
1391 case LayoutDocEntry::DirSubDirs:
1392 case LayoutDocEntry::DirFiles:
1393 case LayoutDocEntry::DirGraph:
1394 err("Internal inconsistency: member '{}' should not be part of "
1395 "LayoutDocManager::Group entry list\n",lde->entryToString());
1396 break;
1397 }
1398 }
1399
1400 //---------------------------------------- end flexible part -------------------------------
1401
1402 for (auto &subgd : getSubGroups())
1403 {
1404 if (!subgd->isReference())
1405 {
1406 if (subgd->partOfGroups().front() == this)
1407 {
1408 ol.writePageLink(subgd->getOutputFileBase(), FALSE);
1409 }
1410 else
1411 {
1412 // Could write a note explaining that the subgroup belongs to another
1413 // group and add a link here.
1414 }
1415 }
1416 }
1417 if (generateTreeView && Config_getBool(PAGE_OUTLINE_PANEL))
1418 {
1419 ol.pushGeneratorState();
1421 ol.endContents();
1422 ol.writeString("</div><!-- doc-content -->\n");
1424 ol.writeString("</div><!-- container -->\n");
1425 ol.popGeneratorState();
1426 endFile(ol,true,true);
1427 }
1428 else
1429 {
1430 endFile(ol);
1431 }
1432
1433 ol.popGeneratorState();
1434
1435 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1436 {
1437 m_allMemberList.sort();
1438 writeMemberPages(ol, hierarchyLevel + 1);
1439 }
1440}
1441
1442void GroupDefImpl::writeMemberPages(OutputList &ol, int hierarchyLevel)
1443{
1444 ol.pushGeneratorState();
1446
1447 for (const auto &ml : m_memberLists)
1448 {
1449 if (ml->listType().isDocumentation())
1450 {
1451 ml->writeDocumentationPage(ol,name(),this,hierarchyLevel);
1452 }
1453 }
1454
1455 ol.popGeneratorState();
1456}
1457
1459{
1460 bool createSubDirs=Config_getBool(CREATE_SUBDIRS);
1461
1462 ol.writeString(" <div class=\"navtab\">\n");
1463 ol.writeString(" <table>\n");
1464
1465 for (const auto *md : m_allMemberList)
1466 {
1467 if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
1468 {
1469 if (md->isLinkableInProject())
1470 {
1471 QCString fn = md->getOutputFileBase();
1473 if (md==currentMd) // selected item => highlight
1474 {
1475 ol.writeString(" <tr><td class=\"navtabHL\">");
1476 }
1477 else
1478 {
1479 ol.writeString(" <tr><td class=\"navtab\">");
1480 }
1481 ol.writeString("<span class=\"label\"><a ");
1482 ol.writeString("href=\"");
1483 if (createSubDirs) ol.writeString("../../");
1484 ol.writeString(fn+"#"+md->anchor());
1485 ol.writeString("\">");
1486 ol.writeString(convertToHtml(md->localName()));
1487 ol.writeString("</a></span>");
1488 ol.writeString("</td></tr>\n");
1489 }
1490 }
1491 }
1492 ol.writeString(" </table>\n");
1493 ol.writeString(" </div>\n");
1494}
1495
1496
1497
1498//---- helper functions ------------------------------------------------------
1499
1500void addClassToGroups(const Entry *root,ClassDef *cd)
1501{
1502 for (const Grouping &g : root->groups)
1503 {
1504 GroupDef *gd=nullptr;
1505 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1506 if (gd && gd->addClass(cd))
1507 {
1509 if (cdm)
1510 {
1511 cdm->makePartOfGroup(gd);
1512 }
1513 //printf("Compound %s: in group %s\n",qPrint(cd->name()),gd->groupTitle());
1514 }
1515 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1516 {
1517 warn(root->fileName, root->startLine,
1518 "Found non-existing group '{}' for the command '{}', ignoring command",
1520 );
1521 }
1522 }
1523}
1524
1526{
1527 for (const Grouping &g : root->groups)
1528 {
1530 if (gd && gd->addConcept(cd))
1531 {
1533 if (cdm)
1534 {
1535 cdm->makePartOfGroup(gd);
1536 }
1537 //printf("Compound %s: in group %s\n",qPrint(cd->name()),gd->groupTitle());
1538 }
1539 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1540 {
1541 warn(root->fileName, root->startLine,
1542 "Found non-existing group '{}' for the command '{}', ignoring command",
1544 );
1545 }
1546 }
1547}
1548
1549void addModuleToGroups(const Entry *root,ModuleDef *mod)
1550{
1551 for (const Grouping &g : root->groups)
1552 {
1554 if (gd && gd->addModule(mod))
1555 {
1556 mod->makePartOfGroup(gd);
1557 //printf("Module %s: in group %s\n",qPrint(mod->name()),gd->groupTitle());
1558 }
1559 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1560 {
1561 warn(root->fileName, root->startLine,
1562 "Found non-existing group '{}' for the command '{}', ignoring command",
1564 );
1565 }
1566 }
1567}
1568
1569
1571{
1572 //printf("root->groups.size()=%zu\n",root->groups.size());
1573 for (const Grouping &g : root->groups)
1574 {
1575 GroupDef *gd=nullptr;
1576 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1577 //printf("group '%s' gd=%p\n",qPrint(g.groupname),(void*)gd);
1578 if (gd && gd->addNamespace(nd))
1579 {
1581 if (ndm)
1582 {
1583 ndm->makePartOfGroup(gd);
1584 }
1585 //printf("Namespace %s: in group %s\n",qPrint(nd->name()),qPrint(gd->name()));
1586 }
1587 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1588 {
1589 warn(root->fileName, root->startLine,
1590 "Found non-existing group '{}' for the command '{}', ignoring command",
1592 );
1593 }
1594 }
1595}
1596
1597void addDirToGroups(const Entry *root,DirDef *dd)
1598{
1599 //printf("*** root->groups.size()=%d\n",root->groups.size());
1600 for (const Grouping &g : root->groups)
1601 {
1603 //printf("group '%s'\n",qPrint(g->groupname));
1604 if (gd)
1605 {
1606 gd->addDir(dd);
1607 dd->makePartOfGroup(gd);
1608 //printf("Dir %s: in group %s\n",qPrint(dd->name()),qPrint(g->groupname));
1609 }
1610 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1611 {
1612 warn(root->fileName, root->startLine,
1613 "Found non-existing group '{}' for the command '{}', ignoring command",
1615 );
1616 }
1617 }
1618}
1619
1620void addGroupToGroups(const Entry *root,GroupDef *subGroup)
1621{
1622 //printf("addGroupToGroups for %s groups=%d\n",qPrint(root->name),root->groups.size());
1623 for (const Grouping &g : root->groups)
1624 {
1626 if (gd)
1627 {
1628 if (gd==subGroup)
1629 {
1630 warn(root->fileName,root->startLine,"Refusing to add group {} to itself",
1631 gd->name());
1632 }
1633 else if (subGroup->findGroup(gd))
1634 {
1635 warn(root->fileName,root->startLine,"Refusing to add group {} to group {}, since the latter is already a "
1636 "subgroup of the former", subGroup->name(),gd->name());
1637 }
1638 else if (!gd->findGroup(subGroup))
1639 {
1640 gd->addGroup(subGroup);
1641 subGroup->makePartOfGroup(gd);
1642 }
1643 }
1644 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1645 {
1646 warn(root->fileName, root->startLine,
1647 "Found non-existing group '{}' for the command '{}', ignoring command",
1649 );
1650 }
1651 }
1652}
1653
1654/*! Add a member to the group with the highest priority */
1655void addMemberToGroups(const Entry *root,MemberDef *md)
1656{
1657 //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%zu\n",
1658 // root, qPrint(root->name), md, qPrint(md->name()), root->groups.size() );
1659
1660 // Search entry's group list for group with highest pri.
1662 GroupDef *fgd=nullptr;
1663 for (const Grouping &g : root->groups)
1664 {
1665 GroupDef *gd=nullptr;
1666 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1667 if (gd && g.pri >= pri)
1668 {
1669 if (fgd && gd!=fgd && g.pri==pri)
1670 {
1671 warn(root->fileName, root->startLine,
1672 "Member {} found in multiple {} groups! "
1673 "The member will be put in group {}, and not in group {}",
1674 md->name(), Grouping::getGroupPriName( pri ),
1675 gd->name(), fgd->name()
1676 );
1677 }
1678
1679 fgd = gd;
1680 pri = g.pri;
1681 }
1682 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1683 {
1684 warn(root->fileName, root->startLine,
1685 "Found non-existing group '{}' for the command '{}', ignoring command",
1687 );
1688 }
1689 }
1690 //printf("fgd=%p\n",fgd);
1691
1692 // put member into group defined by this entry?
1693 if (fgd)
1694 {
1695 GroupDef *mgd = md->getGroupDef();
1696 //printf("mgd=%p\n",mgd);
1697 bool insertit = FALSE;
1698 if (mgd==nullptr)
1699 {
1700 insertit = TRUE;
1701 }
1702 else if (mgd!=fgd)
1703 {
1704 bool moveit = FALSE;
1705
1706 // move member from one group to another if
1707 // - the new one has a higher priority
1708 // - the new entry has the same priority, but with docs where the old one had no docs
1709 if (md->getGroupPri()<pri)
1710 {
1711 moveit = TRUE;
1712 }
1713 else
1714 {
1715 if (md->getGroupPri()==pri)
1716 {
1717 if (!root->doc.isEmpty() && !md->getGroupHasDocs())
1718 {
1719 moveit = TRUE;
1720 }
1721 else if (!root->doc.isEmpty() && md->getGroupHasDocs())
1722 {
1724 "Member documentation for {} found several times in {} groups!\n"
1725 "{}:{}: The member will remain in group {}, and won't be put into group {}",
1726 md->name(), Grouping::getGroupPriName( pri ),
1727 root->fileName, root->startLine,
1728 mgd->name(), fgd->name()
1729 );
1730 }
1731 }
1732 }
1733
1734 if (moveit)
1735 {
1736 //printf("removeMember\n");
1737 mgd->removeMember(md);
1738 insertit = TRUE;
1739 }
1740 }
1741
1742 if (insertit)
1743 {
1744 //printf("insertMember found at %s line %d: %s: related %s\n",
1745 // qPrint(md->getDefFileName()),md->getDefLine(),
1746 // qPrint(md->name()),qPrint(root->relates));
1747 bool success = fgd->insertMember(md);
1748 if (success)
1749 {
1751 if (mdm)
1752 {
1753 //printf("insertMember successful\n");
1754 mdm->setGroupDef(fgd,pri,root->fileName,root->startLine,!root->doc.isEmpty());
1756 if (cdm)
1757 {
1758 cdm->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
1759 }
1760 if (mdm->isEnumerate() && mdm->getGroupDef() && md->isStrong())
1761 {
1762 for (const auto &emd : mdm->enumFieldList())
1763 {
1765 if (emdm && emdm->getGroupDef()==nullptr)
1766 {
1767 emdm->setGroupDef(mdm->getGroupDef(),mdm->getGroupPri(),
1768 mdm->getGroupFileName(),mdm->getGroupStartLine(),
1769 mdm->getGroupHasDocs());
1770 }
1771 }
1772 }
1773 }
1774 }
1775 }
1776 }
1777}
1778
1779
1780void addExampleToGroups(const Entry *root,PageDef *eg)
1781{
1782 for (const Grouping &g : root->groups)
1783 {
1785 if (gd)
1786 {
1787 gd->addExample(eg);
1788 eg->makePartOfGroup(gd);
1789 //printf("Example %s: in group %s\n",qPrint(eg->name()),s->data());
1790 }
1791 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1792 {
1793 warn(root->fileName, root->startLine,
1794 "Found non-existing group '{}' for the command '{}', ignoring command",
1796 );
1797 }
1798 }
1799}
1800
1802{
1803 return m_fileName;
1804}
1805
1807{
1808 {
1809 const RefItemVector &xrefItems = xrefListItems();
1810 addRefItem(xrefItems,
1812 theTranslator->trGroup(TRUE,TRUE),
1814 QCString(),
1815 nullptr
1816 );
1817 }
1818 for (const auto &mg : m_memberGroups)
1819 {
1820 mg->addListReferences(this);
1821 }
1822 for (auto &ml : m_memberLists)
1823 {
1824 if (ml->listType().isDocumentation())
1825 {
1826 ml->addListReferences(this);
1827 }
1828 }
1829}
1830
1832{
1833 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
1834 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
1835 const auto &ml = m_memberLists.get(lt,MemberListContainer::Group);
1836 ml->setNeedsSorting(
1837 (ml->listType().isDeclaration() && sortBriefDocs) ||
1838 (ml->listType().isDocumentation() && sortMemberDocs));
1839 ml->push_back(md);
1840}
1841
1842// performs a partial reordering to group elements together with the same scope
1843template<class Vec>
1844static void groupClassesWithSameScope(Vec &vec)
1845{
1846 bool done=false;
1847 while (!done) // for each iteration
1848 {
1849 done=true;
1850 for (size_t i=0; i<vec.size(); i++) // go through all items
1851 {
1852 std::string qni = vec[i]->name().str();
1853 size_t posi = qni.rfind("::");
1854 if (posi!=std::string::npos)
1855 {
1856 std::string scope = qni.substr(0,posi);
1857 auto it = std::find_if( vec.begin(), vec.end(),
1858 [&](typename Vec::Ptr &cd)
1859 { return cd->name().str()==scope; });
1860 if (it!=vec.end())
1861 {
1862 size_t idx = std::distance(vec.begin(),it);
1863 if (i<idx) // parent scope located after child scope
1864 {
1865 // to avoid reordering elements with the same parent
1866 // we skip to the last one with the same scope
1867 size_t k = idx;
1868 while (k<vec.size() && vec[k]->name().str().substr(0,posi)==scope)
1869 {
1870 idx = k;
1871 k++;
1872 }
1873 // swap the items such that i is inserted after idx
1874 for (size_t j=i; j<idx; j++)
1875 {
1876 std::swap(vec[j],vec[j+1]);
1877 }
1878 done=false;
1879 }
1880 else if (idx<i && vec[i-1]->name().str().substr(0,posi)!=scope)
1881 {
1882 // parent scope is found before the item, and the item
1883 // has some other item with a different scope in front of it
1884 // move idx to the end of range with the same scope
1885 while (idx<i && vec[idx]->name().str().substr(0,posi)==scope)
1886 {
1887 idx++;
1888 }
1889 // swap the items such that i is just after idx
1890 for (size_t j=idx; j<i; j++)
1891 {
1892 std::swap(vec[j],vec[j+1]);
1893 }
1894 done=false;
1895 }
1896 }
1897 }
1898 }
1899 }
1900}
1901
1903{
1904 for (auto &ml : m_memberLists)
1905 {
1906 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
1907 }
1908 if (Config_getBool(SORT_BRIEF_DOCS))
1909 {
1910 std::stable_sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
1911
1912 auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
1913 {
1914 return Config_getBool(SORT_BY_SCOPE_NAME) ?
1915 qstricmp_sort(c1->name(), c2->name())<0 :
1916 qstricmp_sort(c1->className(), c2->className())<0;
1917 };
1918 std::stable_sort(m_classes.begin(), m_classes.end(), classComp);
1919
1920 auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
1921 {
1922 return qstricmp_sort(n1->name(),n2->name())<0;
1923 };
1924
1925 std::stable_sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
1926
1927 auto moduleComp = [](const ModuleLinkedRefMap::Ptr &m1,const ModuleLinkedRefMap::Ptr &m2)
1928 {
1929 return qstricmp_sort(m1->name(),m2->name())<0;
1930 };
1931
1932 std::stable_sort(m_modules.begin(), m_modules.end(), moduleComp);
1933
1934 auto conceptComp = [](const ConceptLinkedRefMap::Ptr &c1,const ConceptLinkedRefMap::Ptr &c2)
1935 {
1936 return qstricmp_sort(c1->name(),c2->name())<0;
1937 };
1938
1939 std::stable_sort(m_concepts.begin(), m_concepts.end(), conceptComp);
1940
1941 std::stable_sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
1942 std::stable_sort(m_fileList.begin(), m_fileList.end(), compareFileDefs);
1943
1944 }
1945 else
1946 {
1949 }
1950}
1951
1953{
1954 for (auto &ml : m_memberLists)
1955 {
1956 if (ml->listType()==lt)
1957 {
1958 return ml.get();
1959 }
1960 }
1961 return nullptr;
1962}
1963
1965{
1966 bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1967
1968 MemberList * ml = getMemberList(lt);
1969 if (optimizeVhdl && ml)
1970 {
1971 VhdlDocGen::writeVhdlDeclarations(ml,ol,this,nullptr,nullptr,nullptr,nullptr);
1972 return;
1973 }
1974 if (ml)
1975 {
1976 ml->writeDeclarations(ol,nullptr,nullptr,nullptr,this,nullptr,title,QCString());
1977 }
1978}
1979
1981{
1982 MemberList * ml = getMemberList(lt);
1983 if (ml) ml->writeDocumentation(ol,name(),this,title,ml->listType().toLabel());
1984}
1985
1987{
1988 MemberList *ml = getMemberList(lt);
1989 if (ml) ml->remove(md);
1990}
1991
1993{
1994 if (Config_getBool(SORT_BRIEF_DOCS))
1995 {
1996 std::stable_sort(m_groups.begin(),
1997 m_groups.end(),
1998 [](const auto &g1,const auto &g2)
1999 { return g1->groupTitle() < g2->groupTitle(); });
2000 }
2001}
2002
2003static bool hasNonReferenceNestedGroupRec(const GroupDef *gd,int level)
2004{
2005 if (level>30)
2006 {
2007 err("Possible recursive group relation while inside {}\n",gd->name());
2008 return false;
2009 }
2010 bool found=gd->isLinkableInProject();
2011 if (found)
2012 {
2013 return true;
2014 }
2015 else
2016 {
2017 for (const auto &igd : gd->getSubGroups())
2018 {
2019 found = found || hasNonReferenceNestedGroupRec(igd,level+1);
2020 if (found) break;
2021 }
2022 }
2023 return found;
2024}
2025
2027{
2028 bool allExternals = Config_getBool(EXTERNAL_GROUPS);
2029 return (allExternals || hasNonReferenceNestedGroupRec(this,0)) && isLinkable();
2030}
2031
2033{
2034 return !isReference() && isLinkable();
2035}
2036
2038{
2039 return hasUserDocumentation();
2040}
2041
2042// let the "programming language" for a group depend on what is inserted into it.
2043// First item that has an associated languages determines the language for the whole group.
2045{
2046 if (getLanguage()==SrcLangExt::Unknown && d->getLanguage()!=SrcLangExt::Unknown)
2047 {
2049 }
2050}
2051
2053{
2054 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
2055 return ((!briefDescription().isEmpty() && repeatBrief) ||
2056 !documentation().isEmpty() ||
2057 !inbodyDocumentation().isEmpty()) &&
2058 (m_pages.size()!=numDocMembers());
2059}
2060
2062{
2064}
2065
2067{
2068 return m_hasGroupGraph;
2069}
2070
2071// --- Cast functions
2072
2074{
2075 if (d==nullptr) return nullptr;
2076 if (d && typeid(*d)==typeid(GroupDefImpl))
2077 {
2078 return static_cast<GroupDef*>(d);
2079 }
2080 else
2081 {
2082 return nullptr;
2083 }
2084}
2085
2087{
2088 if (d==nullptr) return nullptr;
2089 if (d && typeid(*d)==typeid(GroupDefImpl))
2090 {
2091 return static_cast<const GroupDef*>(d);
2092 }
2093 else
2094 {
2095 return nullptr;
2096 }
2097}
2098
2099
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
int getStartBodyLine() 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:178
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:964
bool findGroup(const GroupDef *def) const override
Definition groupdef.cpp:586
void writeDirs(OutputList &ol, const QCString &title)
~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:901
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:926
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:970
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:859
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:1437
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:125
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:130
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 noexcept
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:315
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md, int sectionLevel=-1)
Definition outputlist.h:383
void endTextBlock(bool paraBreak=FALSE)
Definition outputlist.h:672
void writeString(const QCString &text)
Definition outputlist.h:411
void startMemberDeclaration()
Definition outputlist.h:569
void startIndexItem(const QCString &ref, const QCString &file)
Definition outputlist.h:433
void endTitleHead(const QCString &fileName, const QCString &name)
Definition outputlist.h:405
void endSection(const QCString &lab, SectionType t)
Definition outputlist.h:588
void disable(OutputType o)
void startTitleHead(const QCString &fileName)
Definition outputlist.h:403
void writeRuler()
Definition outputlist.h:521
void endGroupCollaboration(DotGroupCollaboration &g)
Definition outputlist.h:666
void startGroupHeader(const QCString &id=QCString(), int extraLevels=0)
Definition outputlist.h:453
void enable(OutputType o)
void endContents()
Definition outputlist.h:620
void endHeaderSection()
Definition outputlist.h:467
void endMemberDescription()
Definition outputlist.h:567
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:439
void startGroupCollaboration()
Definition outputlist.h:664
void startMemberDescription(const QCString &anchor, const QCString &inheritId=QCString(), bool typ=false)
Definition outputlist.h:565
void endIndexItem(const QCString &ref, const QCString &file)
Definition outputlist.h:435
void startHeaderSection()
Definition outputlist.h:465
void docify(const QCString &s)
Definition outputlist.h:437
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, const DocOptions &options)
void startParagraph(const QCString &classDef=QCString())
Definition outputlist.h:407
void startTextBlock(bool dense=FALSE)
Definition outputlist.h:670
void endParagraph()
Definition outputlist.h:409
void startMemberSections()
Definition outputlist.h:461
void startMemberList()
Definition outputlist.h:481
void endTextLink()
Definition outputlist.h:444
void endMemberItem(OutputGenerator::MemberItemType type)
Definition outputlist.h:495
void endMemberList()
Definition outputlist.h:483
void writeSynopsis()
Definition outputlist.h:592
void pushGeneratorState()
void insertMemberAlign(bool templ=FALSE)
Definition outputlist.h:517
void disableAllBut(OutputType o)
void popGeneratorState()
void writeSummaryLink(const QCString &file, const QCString &anchor, const QCString &title, bool first)
Definition outputlist.h:614
void writeAnchor(const QCString &fileName, const QCString &name)
Definition outputlist.h:523
void endGroupHeader(int extraLevels=0)
Definition outputlist.h:455
void writePageOutline()
Definition outputlist.h:616
void startContents()
Definition outputlist.h:618
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:571
void writePageLink(const QCString &name, bool first)
Definition outputlist.h:389
void enableAll()
void endMemberHeader()
Definition outputlist.h:471
void startMemberItem(const QCString &anchor, OutputGenerator::MemberItemType type, const QCString &id=QCString())
Definition outputlist.h:493
void parseText(const QCString &textStr)
void startSection(const QCString &lab, const QCString &title, SectionType t)
Definition outputlist.h:586
void startTextLink(const QCString &file, const QCString &anchor)
Definition outputlist.h:442
void startMemberHeader(const QCString &anchor, int typ=2)
Definition outputlist.h:469
void endMemberSections()
Definition outputlist.h:463
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:422
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
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:178
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:1215
void docFindSections(const QCString &input, const Definition *d, const QCString &fileName)
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:55
static void writeTagFile()
bool compareFileDefs(const FileDef *fd1, const FileDef *fd2)
Definition filedef.cpp:1949
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, bool isSource, 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
static constexpr const char * getGroupPriName(GroupPri_t priority) noexcept
Definition types.h:240
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
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:1788
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:1800
Definition layout.h:102
QCString title(SrcLangExt lang) const
Definition layout.cpp:1781
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:3893
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:4746
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:4833
void createSubDirs(const Dir &d)
Definition util.cpp:3570
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:1959
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:3842
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:4843
A bunch of utility functions.