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 ol.endIndexItem(gd->getReference(),gd->getOutputFileBase());
1004 if (!gd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
1005 {
1006 ol.startMemberDescription(gd->getOutputFileBase());
1008 briefLine(),
1009 gd,
1010 nullptr,
1011 gd->briefDescription(),
1012 DocOptions()
1013 .setSingleLine(true));
1015 }
1017 }
1018 }
1019 ol.endMemberList();
1020 }
1021}
1022
1024{
1025 // write list of directories
1026 if (!m_dirList.empty())
1027 {
1028 ol.startMemberHeader("dirs");
1029 ol.parseText(title);
1030 ol.endMemberHeader();
1031 ol.startMemberList();
1032 for(const auto dd : m_dirList)
1033 {
1034 if (!dd->hasDocumentation()) continue;
1036 QCString anc = dd->anchor();
1037 if (anc.isEmpty()) anc=dd->shortName(); else anc.prepend(dd->shortName()+"_");
1039 ol.parseText(theTranslator->trDir(FALSE,TRUE));
1040 ol.insertMemberAlign();
1041 ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),QCString(),dd->shortName());
1043 if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
1044 {
1045 ol.startMemberDescription(dd->getOutputFileBase());
1047 briefLine(),
1048 dd,
1049 nullptr,
1050 dd->briefDescription(),
1051 DocOptions()
1052 .setSingleLine(true));
1054 }
1056 }
1057
1058 ol.endMemberList();
1059 }
1060}
1061
1063{
1064 // write list of classes
1065 m_classes.writeDeclaration(ol,nullptr,title,FALSE);
1066}
1067
1069{
1070 // write list of concepts
1071 m_concepts.writeDeclaration(ol,title,FALSE);
1072}
1073
1075{
1076 // write list of modules
1077 m_modules.writeDeclaration(ol,title,FALSE);
1078}
1079
1080
1082{
1083 m_classes.writeDocumentation(ol);
1084}
1085
1087{
1088 for (const auto *pd : m_pages)
1089 {
1090 if (!pd->isReference())
1091 {
1092 const SectionInfo *si=nullptr;
1093 if (pd->hasTitle() && !pd->name().isEmpty() &&
1094 (si=SectionManager::instance().find(pd->name()))!=nullptr)
1095 {
1097 ol.docify(si->title());
1099 }
1100 ol.startTextBlock();
1101 ol.generateDoc(pd->docFile(),
1102 pd->docLine(),
1103 pd,
1104 nullptr,
1105 (pd->documentation()+pd->inbodyDocumentation()),
1106 DocOptions()
1107 .setIndexWords(true));
1108 ol.endTextBlock();
1109 }
1110 }
1111}
1112
1114{
1115 /* write user defined member groups */
1116 for (const auto &mg : m_memberGroups)
1117 {
1118 mg->writeDeclarations(ol,nullptr,nullptr,nullptr,this,nullptr);
1119 }
1120}
1121
1126
1131
1133{
1134 //printf("** GroupDefImpl::startMemberDocumentation()\n");
1135 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1136 {
1137 ol.pushGeneratorState();
1140 }
1141}
1142
1144{
1145 //printf("** GroupDefImpl::endMemberDocumentation()\n");
1146 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1147 {
1148 ol.popGeneratorState();
1150 }
1151}
1152
1154{
1155 // write Author section (Man only)
1156 ol.pushGeneratorState();
1158 ol.startGroupHeader();
1159 ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
1160 ol.endGroupHeader();
1161 ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString(PROJECT_NAME)));
1162 ol.popGeneratorState();
1163}
1164
1166{
1167 ol.pushGeneratorState();
1169 bool first=TRUE;
1170 SrcLangExt lang = getLanguage();
1171 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1172 {
1173 if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classes.declVisible()) ||
1174 (lde->kind()==LayoutDocEntry::GroupConcepts && m_concepts.declVisible()) ||
1175 (lde->kind()==LayoutDocEntry::GroupModules && m_modules.declVisible()) ||
1176 (lde->kind()==LayoutDocEntry::GroupNamespaces && m_namespaces.declVisible(false)) ||
1177 (lde->kind()==LayoutDocEntry::GroupFiles && !m_fileList.empty()) ||
1178 (lde->kind()==LayoutDocEntry::GroupNestedGroups && !m_groups.empty()) ||
1179 (lde->kind()==LayoutDocEntry::GroupDirs && !m_dirList.empty())
1180 )
1181 {
1182 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1183 if (ls)
1184 {
1185 QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
1186 lde->kind()==LayoutDocEntry::GroupConcepts ? "concepts" :
1187 lde->kind()==LayoutDocEntry::GroupModules ? "modules" :
1188 lde->kind()==LayoutDocEntry::GroupNamespaces ? "namespaces" :
1189 lde->kind()==LayoutDocEntry::GroupFiles ? "files" :
1190 lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" :
1191 "dirs";
1192 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
1193 first=FALSE;
1194 }
1195 }
1196 else if (lde->kind()==LayoutDocEntry::MemberDecl)
1197 {
1198 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1199 if (lmd)
1200 {
1201 MemberList * ml = getMemberList(lmd->type);
1202 if (ml && ml->declVisible())
1203 {
1204 ol.writeSummaryLink(QCString(),ml->listType().toLabel(),lmd->title(lang),first);
1205 first=FALSE;
1206 }
1207 }
1208 }
1209 }
1210 if (!first)
1211 {
1212 ol.writeString(" </div>\n");
1213 }
1214 ol.popGeneratorState();
1215}
1216
1221
1223{
1224 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
1225 ol.pushGeneratorState();
1226
1227 // Find out how deep this group is nested. In case of multiple parents, use the first one.
1228 int hierarchyLevel = 0;
1229 const GroupDef *gd = this;
1230 while (!gd->partOfGroups().empty())
1231 {
1232 gd = gd->partOfGroups().front();
1233 ++hierarchyLevel;
1234 }
1235
1237 FALSE /* additionalIndices*/, QCString() /*altSidebarName*/, hierarchyLevel);
1238
1239 ol.startHeaderSection();
1240 bool writeOutlinePanel = generateTreeView && Config_getBool(PAGE_OUTLINE_PANEL);
1241 if (!writeOutlinePanel) writeSummaryLinks(ol);
1243 //1.{
1244 ol.pushGeneratorState();
1246 ol.generateDoc(docFile(),
1248 this,
1249 nullptr,
1250 m_title,
1251 DocOptions()
1252 .setIndexWords(true)
1253 .setSingleLine(true)
1254 .setAutolinkSupport(false));
1255 ol.popGeneratorState();
1256 //1.}
1257 addGroupListToTitle(ol,this);
1258 //2.{
1259 ol.pushGeneratorState();
1262 ol.popGeneratorState();
1263 //2.}
1264 //3.{
1265 ol.pushGeneratorState();
1268 if (!m_title.isEmpty())
1269 {
1270 ol.writeString(" - ");
1271 ol.parseText(m_title);
1272 }
1273 ol.popGeneratorState();
1274 //3.}
1275 ol.endHeaderSection();
1276 ol.startContents();
1277
1278 //---------------------------------------- start flexible part -------------------------------
1279
1280 SrcLangExt lang=getLanguage();
1281 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1282 {
1283 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1284 switch (lde->kind())
1285 {
1286 case LayoutDocEntry::BriefDesc:
1288 break;
1289 case LayoutDocEntry::MemberDeclStart:
1291 break;
1292 case LayoutDocEntry::GroupClasses:
1293 if (ls) writeClasses(ol,ls->title(lang));
1294 break;
1295 case LayoutDocEntry::GroupConcepts:
1296 if (ls) writeConcepts(ol,ls->title(lang));
1297 break;
1298 case LayoutDocEntry::GroupModules:
1299 if (ls) writeModules(ol,ls->title(lang));
1300 break;
1301 case LayoutDocEntry::GroupInlineClasses:
1303 break;
1304 case LayoutDocEntry::GroupNamespaces:
1305 if (ls) writeNamespaces(ol,ls->title(lang));
1306 break;
1307 case LayoutDocEntry::MemberGroups:
1309 break;
1310 case LayoutDocEntry::MemberDecl:
1311 {
1312 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1313 if (lmd)
1314 {
1315 writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
1316 }
1317 }
1318 break;
1319 case LayoutDocEntry::MemberDeclEnd:
1321 break;
1322 case LayoutDocEntry::DetailedDesc:
1323 if (ls) writeDetailedDescription(ol,ls->title(lang));
1324 break;
1325 case LayoutDocEntry::MemberDefStart:
1327 break;
1328 case LayoutDocEntry::MemberDef:
1329 {
1330 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
1331 if (lmd)
1332 {
1333 writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
1334 }
1335 }
1336 break;
1337 case LayoutDocEntry::MemberDefEnd:
1339 break;
1340 case LayoutDocEntry::GroupNestedGroups:
1341 if (ls) writeNestedGroups(ol,ls->title(lang));
1342 break;
1343 case LayoutDocEntry::GroupPageDocs:
1345 break;
1346 case LayoutDocEntry::GroupDirs:
1347 if (ls) writeDirs(ol,ls->title(lang));
1348 break;
1349 case LayoutDocEntry::GroupFiles:
1350 if (ls) writeFiles(ol,ls->title(lang));
1351 break;
1352 case LayoutDocEntry::GroupGraph:
1353 writeGroupGraph(ol);
1354 break;
1355 case LayoutDocEntry::AuthorSection:
1357 break;
1358 case LayoutDocEntry::ClassIncludes:
1359 case LayoutDocEntry::ClassInheritanceGraph:
1360 case LayoutDocEntry::ClassNestedClasses:
1361 case LayoutDocEntry::ClassCollaborationGraph:
1362 case LayoutDocEntry::ClassAllMembersLink:
1363 case LayoutDocEntry::ClassUsedFiles:
1364 case LayoutDocEntry::ClassInlineClasses:
1365 case LayoutDocEntry::NamespaceNestedNamespaces:
1366 case LayoutDocEntry::NamespaceNestedConstantGroups:
1367 case LayoutDocEntry::NamespaceClasses:
1368 case LayoutDocEntry::NamespaceConcepts:
1369 case LayoutDocEntry::NamespaceInterfaces:
1370 case LayoutDocEntry::NamespaceStructs:
1371 case LayoutDocEntry::NamespaceExceptions:
1372 case LayoutDocEntry::NamespaceInlineClasses:
1373 case LayoutDocEntry::ConceptDefinition:
1374 case LayoutDocEntry::FileClasses:
1375 case LayoutDocEntry::FileConcepts:
1376 case LayoutDocEntry::FileInterfaces:
1377 case LayoutDocEntry::FileStructs:
1378 case LayoutDocEntry::FileExceptions:
1379 case LayoutDocEntry::FileNamespaces:
1380 case LayoutDocEntry::FileConstantGroups:
1381 case LayoutDocEntry::FileIncludes:
1382 case LayoutDocEntry::FileIncludeGraph:
1383 case LayoutDocEntry::FileIncludedByGraph:
1384 case LayoutDocEntry::FileSourceLink:
1385 case LayoutDocEntry::FileInlineClasses:
1386 case LayoutDocEntry::ModuleExports:
1387 case LayoutDocEntry::ModuleClasses:
1388 case LayoutDocEntry::ModuleConcepts:
1389 case LayoutDocEntry::ModuleUsedFiles:
1390 case LayoutDocEntry::DirSubDirs:
1391 case LayoutDocEntry::DirFiles:
1392 case LayoutDocEntry::DirGraph:
1393 err("Internal inconsistency: member '{}' should not be part of "
1394 "LayoutDocManager::Group entry list\n",lde->entryToString());
1395 break;
1396 }
1397 }
1398
1399 //---------------------------------------- end flexible part -------------------------------
1400
1401 for (auto &subgd : getSubGroups())
1402 {
1403 if (!subgd->isReference())
1404 {
1405 if (subgd->partOfGroups().front() == this)
1406 {
1407 ol.writePageLink(subgd->getOutputFileBase(), FALSE);
1408 }
1409 else
1410 {
1411 // Could write a note explaining that the subgroup belongs to another
1412 // group and add a link here.
1413 }
1414 }
1415 }
1416 if (generateTreeView && Config_getBool(PAGE_OUTLINE_PANEL))
1417 {
1418 ol.pushGeneratorState();
1420 ol.endContents();
1421 ol.writeString("</div><!-- doc-content -->\n");
1423 ol.writeString("</div><!-- container -->\n");
1424 ol.popGeneratorState();
1425 endFile(ol,true,true);
1426 }
1427 else
1428 {
1429 endFile(ol);
1430 }
1431
1432 ol.popGeneratorState();
1433
1434 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1435 {
1436 m_allMemberList.sort();
1437 writeMemberPages(ol, hierarchyLevel + 1);
1438 }
1439}
1440
1441void GroupDefImpl::writeMemberPages(OutputList &ol, int hierarchyLevel)
1442{
1443 ol.pushGeneratorState();
1445
1446 for (const auto &ml : m_memberLists)
1447 {
1448 if (ml->listType().isDocumentation())
1449 {
1450 ml->writeDocumentationPage(ol,name(),this,hierarchyLevel);
1451 }
1452 }
1453
1454 ol.popGeneratorState();
1455}
1456
1458{
1459 bool createSubDirs=Config_getBool(CREATE_SUBDIRS);
1460
1461 ol.writeString(" <div class=\"navtab\">\n");
1462 ol.writeString(" <table>\n");
1463
1464 for (const auto *md : m_allMemberList)
1465 {
1466 if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
1467 {
1468 if (md->isLinkableInProject())
1469 {
1470 QCString fn = md->getOutputFileBase();
1472 if (md==currentMd) // selected item => highlight
1473 {
1474 ol.writeString(" <tr><td class=\"navtabHL\">");
1475 }
1476 else
1477 {
1478 ol.writeString(" <tr><td class=\"navtab\">");
1479 }
1480 ol.writeString("<span class=\"label\"><a ");
1481 ol.writeString("href=\"");
1482 if (createSubDirs) ol.writeString("../../");
1483 ol.writeString(fn+"#"+md->anchor());
1484 ol.writeString("\">");
1485 ol.writeString(convertToHtml(md->localName()));
1486 ol.writeString("</a></span>");
1487 ol.writeString("</td></tr>\n");
1488 }
1489 }
1490 }
1491 ol.writeString(" </table>\n");
1492 ol.writeString(" </div>\n");
1493}
1494
1495
1496
1497//---- helper functions ------------------------------------------------------
1498
1499void addClassToGroups(const Entry *root,ClassDef *cd)
1500{
1501 for (const Grouping &g : root->groups)
1502 {
1503 GroupDef *gd=nullptr;
1504 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1505 if (gd && gd->addClass(cd))
1506 {
1508 if (cdm)
1509 {
1510 cdm->makePartOfGroup(gd);
1511 }
1512 //printf("Compound %s: in group %s\n",qPrint(cd->name()),gd->groupTitle());
1513 }
1514 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1515 {
1516 warn(root->fileName, root->startLine,
1517 "Found non-existing group '{}' for the command '{}', ignoring command",
1519 );
1520 }
1521 }
1522}
1523
1525{
1526 for (const Grouping &g : root->groups)
1527 {
1529 if (gd && gd->addConcept(cd))
1530 {
1532 if (cdm)
1533 {
1534 cdm->makePartOfGroup(gd);
1535 }
1536 //printf("Compound %s: in group %s\n",qPrint(cd->name()),gd->groupTitle());
1537 }
1538 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1539 {
1540 warn(root->fileName, root->startLine,
1541 "Found non-existing group '{}' for the command '{}', ignoring command",
1543 );
1544 }
1545 }
1546}
1547
1548void addModuleToGroups(const Entry *root,ModuleDef *mod)
1549{
1550 for (const Grouping &g : root->groups)
1551 {
1553 if (gd && gd->addModule(mod))
1554 {
1555 mod->makePartOfGroup(gd);
1556 //printf("Module %s: in group %s\n",qPrint(mod->name()),gd->groupTitle());
1557 }
1558 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1559 {
1560 warn(root->fileName, root->startLine,
1561 "Found non-existing group '{}' for the command '{}', ignoring command",
1563 );
1564 }
1565 }
1566}
1567
1568
1570{
1571 //printf("root->groups.size()=%zu\n",root->groups.size());
1572 for (const Grouping &g : root->groups)
1573 {
1574 GroupDef *gd=nullptr;
1575 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1576 //printf("group '%s' gd=%p\n",qPrint(g.groupname),(void*)gd);
1577 if (gd && gd->addNamespace(nd))
1578 {
1580 if (ndm)
1581 {
1582 ndm->makePartOfGroup(gd);
1583 }
1584 //printf("Namespace %s: in group %s\n",qPrint(nd->name()),qPrint(gd->name()));
1585 }
1586 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1587 {
1588 warn(root->fileName, root->startLine,
1589 "Found non-existing group '{}' for the command '{}', ignoring command",
1591 );
1592 }
1593 }
1594}
1595
1596void addDirToGroups(const Entry *root,DirDef *dd)
1597{
1598 //printf("*** root->groups.size()=%d\n",root->groups.size());
1599 for (const Grouping &g : root->groups)
1600 {
1602 //printf("group '%s'\n",qPrint(g->groupname));
1603 if (gd)
1604 {
1605 gd->addDir(dd);
1606 dd->makePartOfGroup(gd);
1607 //printf("Dir %s: in group %s\n",qPrint(dd->name()),qPrint(g->groupname));
1608 }
1609 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1610 {
1611 warn(root->fileName, root->startLine,
1612 "Found non-existing group '{}' for the command '{}', ignoring command",
1614 );
1615 }
1616 }
1617}
1618
1619void addGroupToGroups(const Entry *root,GroupDef *subGroup)
1620{
1621 //printf("addGroupToGroups for %s groups=%d\n",qPrint(root->name),root->groups.size());
1622 for (const Grouping &g : root->groups)
1623 {
1625 if (gd)
1626 {
1627 if (gd==subGroup)
1628 {
1629 warn(root->fileName,root->startLine,"Refusing to add group {} to itself",
1630 gd->name());
1631 }
1632 else if (subGroup->findGroup(gd))
1633 {
1634 warn(root->fileName,root->startLine,"Refusing to add group {} to group {}, since the latter is already a "
1635 "subgroup of the former", subGroup->name(),gd->name());
1636 }
1637 else if (!gd->findGroup(subGroup))
1638 {
1639 gd->addGroup(subGroup);
1640 subGroup->makePartOfGroup(gd);
1641 }
1642 }
1643 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1644 {
1645 warn(root->fileName, root->startLine,
1646 "Found non-existing group '{}' for the command '{}', ignoring command",
1648 );
1649 }
1650 }
1651}
1652
1653/*! Add a member to the group with the highest priority */
1654void addMemberToGroups(const Entry *root,MemberDef *md)
1655{
1656 //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%zu\n",
1657 // root, qPrint(root->name), md, qPrint(md->name()), root->groups.size() );
1658
1659 // Search entry's group list for group with highest pri.
1661 GroupDef *fgd=nullptr;
1662 for (const Grouping &g : root->groups)
1663 {
1664 GroupDef *gd=nullptr;
1665 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1666 if (gd && g.pri >= pri)
1667 {
1668 if (fgd && gd!=fgd && g.pri==pri)
1669 {
1670 warn(root->fileName, root->startLine,
1671 "Member {} found in multiple {} groups! "
1672 "The member will be put in group {}, and not in group {}",
1673 md->name(), Grouping::getGroupPriName( pri ),
1674 gd->name(), fgd->name()
1675 );
1676 }
1677
1678 fgd = gd;
1679 pri = g.pri;
1680 }
1681 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1682 {
1683 warn(root->fileName, root->startLine,
1684 "Found non-existing group '{}' for the command '{}', ignoring command",
1686 );
1687 }
1688 }
1689 //printf("fgd=%p\n",fgd);
1690
1691 // put member into group defined by this entry?
1692 if (fgd)
1693 {
1694 GroupDef *mgd = md->getGroupDef();
1695 //printf("mgd=%p\n",mgd);
1696 bool insertit = FALSE;
1697 if (mgd==nullptr)
1698 {
1699 insertit = TRUE;
1700 }
1701 else if (mgd!=fgd)
1702 {
1703 bool moveit = FALSE;
1704
1705 // move member from one group to another if
1706 // - the new one has a higher priority
1707 // - the new entry has the same priority, but with docs where the old one had no docs
1708 if (md->getGroupPri()<pri)
1709 {
1710 moveit = TRUE;
1711 }
1712 else
1713 {
1714 if (md->getGroupPri()==pri)
1715 {
1716 if (!root->doc.isEmpty() && !md->getGroupHasDocs())
1717 {
1718 moveit = TRUE;
1719 }
1720 else if (!root->doc.isEmpty() && md->getGroupHasDocs())
1721 {
1723 "Member documentation for {} found several times in {} groups!\n"
1724 "{}:{}: The member will remain in group {}, and won't be put into group {}",
1725 md->name(), Grouping::getGroupPriName( pri ),
1726 root->fileName, root->startLine,
1727 mgd->name(), fgd->name()
1728 );
1729 }
1730 }
1731 }
1732
1733 if (moveit)
1734 {
1735 //printf("removeMember\n");
1736 mgd->removeMember(md);
1737 insertit = TRUE;
1738 }
1739 }
1740
1741 if (insertit)
1742 {
1743 //printf("insertMember found at %s line %d: %s: related %s\n",
1744 // qPrint(md->getDefFileName()),md->getDefLine(),
1745 // qPrint(md->name()),qPrint(root->relates));
1746 bool success = fgd->insertMember(md);
1747 if (success)
1748 {
1750 if (mdm)
1751 {
1752 //printf("insertMember successful\n");
1753 mdm->setGroupDef(fgd,pri,root->fileName,root->startLine,!root->doc.isEmpty());
1755 if (cdm)
1756 {
1757 cdm->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
1758 }
1759 if (mdm->isEnumerate() && mdm->getGroupDef() && md->isStrong())
1760 {
1761 for (const auto &emd : mdm->enumFieldList())
1762 {
1764 if (emdm && emdm->getGroupDef()==nullptr)
1765 {
1766 emdm->setGroupDef(mdm->getGroupDef(),mdm->getGroupPri(),
1767 mdm->getGroupFileName(),mdm->getGroupStartLine(),
1768 mdm->getGroupHasDocs());
1769 }
1770 }
1771 }
1772 }
1773 }
1774 }
1775 }
1776}
1777
1778
1779void addExampleToGroups(const Entry *root,PageDef *eg)
1780{
1781 for (const Grouping &g : root->groups)
1782 {
1784 if (gd)
1785 {
1786 gd->addExample(eg);
1787 eg->makePartOfGroup(gd);
1788 //printf("Example %s: in group %s\n",qPrint(eg->name()),s->data());
1789 }
1790 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1791 {
1792 warn(root->fileName, root->startLine,
1793 "Found non-existing group '{}' for the command '{}', ignoring command",
1795 );
1796 }
1797 }
1798}
1799
1801{
1802 return m_fileName;
1803}
1804
1806{
1807 {
1808 const RefItemVector &xrefItems = xrefListItems();
1809 addRefItem(xrefItems,
1811 theTranslator->trGroup(TRUE,TRUE),
1813 QCString(),
1814 nullptr
1815 );
1816 }
1817 for (const auto &mg : m_memberGroups)
1818 {
1819 mg->addListReferences(this);
1820 }
1821 for (auto &ml : m_memberLists)
1822 {
1823 if (ml->listType().isDocumentation())
1824 {
1825 ml->addListReferences(this);
1826 }
1827 }
1828}
1829
1831{
1832 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
1833 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
1834 const auto &ml = m_memberLists.get(lt,MemberListContainer::Group);
1835 ml->setNeedsSorting(
1836 (ml->listType().isDeclaration() && sortBriefDocs) ||
1837 (ml->listType().isDocumentation() && sortMemberDocs));
1838 ml->push_back(md);
1839}
1840
1841// performs a partial reordering to group elements together with the same scope
1842template<class Vec>
1843static void groupClassesWithSameScope(Vec &vec)
1844{
1845 bool done=false;
1846 while (!done) // for each iteration
1847 {
1848 done=true;
1849 for (size_t i=0; i<vec.size(); i++) // go through all items
1850 {
1851 std::string qni = vec[i]->name().str();
1852 size_t posi = qni.rfind("::");
1853 if (posi!=std::string::npos)
1854 {
1855 std::string scope = qni.substr(0,posi);
1856 auto it = std::find_if( vec.begin(), vec.end(),
1857 [&](typename Vec::Ptr &cd)
1858 { return cd->name().str()==scope; });
1859 if (it!=vec.end())
1860 {
1861 size_t idx = std::distance(vec.begin(),it);
1862 if (i<idx) // parent scope located after child scope
1863 {
1864 // to avoid reordering elements with the same parent
1865 // we skip to the last one with the same scope
1866 size_t k = idx;
1867 while (k<vec.size() && vec[k]->name().str().substr(0,posi)==scope)
1868 {
1869 idx = k;
1870 k++;
1871 }
1872 // swap the items such that i is inserted after idx
1873 for (size_t j=i; j<idx; j++)
1874 {
1875 std::swap(vec[j],vec[j+1]);
1876 }
1877 done=false;
1878 }
1879 else if (idx<i && vec[i-1]->name().str().substr(0,posi)!=scope)
1880 {
1881 // parent scope is found before the item, and the item
1882 // has some other item with a different scope in front of it
1883 // move idx to the end of range with the same scope
1884 while (idx<i && vec[idx]->name().str().substr(0,posi)==scope)
1885 {
1886 idx++;
1887 }
1888 // swap the items such that i is just after idx
1889 for (size_t j=idx; j<i; j++)
1890 {
1891 std::swap(vec[j],vec[j+1]);
1892 }
1893 done=false;
1894 }
1895 }
1896 }
1897 }
1898 }
1899}
1900
1902{
1903 for (auto &ml : m_memberLists)
1904 {
1905 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
1906 }
1907 if (Config_getBool(SORT_BRIEF_DOCS))
1908 {
1909 std::stable_sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
1910
1911 auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
1912 {
1913 return Config_getBool(SORT_BY_SCOPE_NAME) ?
1914 qstricmp_sort(c1->name(), c2->name())<0 :
1915 qstricmp_sort(c1->className(), c2->className())<0;
1916 };
1917 std::stable_sort(m_classes.begin(), m_classes.end(), classComp);
1918
1919 auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
1920 {
1921 return qstricmp_sort(n1->name(),n2->name())<0;
1922 };
1923
1924 std::stable_sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
1925
1926 auto moduleComp = [](const ModuleLinkedRefMap::Ptr &m1,const ModuleLinkedRefMap::Ptr &m2)
1927 {
1928 return qstricmp_sort(m1->name(),m2->name())<0;
1929 };
1930
1931 std::stable_sort(m_modules.begin(), m_modules.end(), moduleComp);
1932
1933 auto conceptComp = [](const ConceptLinkedRefMap::Ptr &c1,const ConceptLinkedRefMap::Ptr &c2)
1934 {
1935 return qstricmp_sort(c1->name(),c2->name())<0;
1936 };
1937
1938 std::stable_sort(m_concepts.begin(), m_concepts.end(), conceptComp);
1939
1940 std::stable_sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
1941 std::stable_sort(m_fileList.begin(), m_fileList.end(), compareFileDefs);
1942
1943 }
1944 else
1945 {
1948 }
1949}
1950
1952{
1953 for (auto &ml : m_memberLists)
1954 {
1955 if (ml->listType()==lt)
1956 {
1957 return ml.get();
1958 }
1959 }
1960 return nullptr;
1961}
1962
1964{
1965 bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1966
1967 MemberList * ml = getMemberList(lt);
1968 if (optimizeVhdl && ml)
1969 {
1970 VhdlDocGen::writeVhdlDeclarations(ml,ol,this,nullptr,nullptr,nullptr,nullptr);
1971 return;
1972 }
1973 if (ml)
1974 {
1975 ml->writeDeclarations(ol,nullptr,nullptr,nullptr,this,nullptr,title,QCString());
1976 }
1977}
1978
1980{
1981 MemberList * ml = getMemberList(lt);
1982 if (ml) ml->writeDocumentation(ol,name(),this,title,ml->listType().toLabel());
1983}
1984
1986{
1987 MemberList *ml = getMemberList(lt);
1988 if (ml) ml->remove(md);
1989}
1990
1992{
1993 if (Config_getBool(SORT_BRIEF_DOCS))
1994 {
1995 std::stable_sort(m_groups.begin(),
1996 m_groups.end(),
1997 [](const auto &g1,const auto &g2)
1998 { return g1->groupTitle() < g2->groupTitle(); });
1999 }
2000}
2001
2002static bool hasNonReferenceNestedGroupRec(const GroupDef *gd,int level)
2003{
2004 if (level>30)
2005 {
2006 err("Possible recursive group relation while inside {}\n",gd->name());
2007 return false;
2008 }
2009 bool found=gd->isLinkableInProject();
2010 if (found)
2011 {
2012 return true;
2013 }
2014 else
2015 {
2016 for (const auto &igd : gd->getSubGroups())
2017 {
2018 found = found || hasNonReferenceNestedGroupRec(igd,level+1);
2019 if (found) break;
2020 }
2021 }
2022 return found;
2023}
2024
2026{
2027 bool allExternals = Config_getBool(EXTERNAL_GROUPS);
2028 return (allExternals || hasNonReferenceNestedGroupRec(this,0)) && isLinkable();
2029}
2030
2032{
2033 return !isReference() && isLinkable();
2034}
2035
2037{
2038 return hasUserDocumentation();
2039}
2040
2041// let the "programming language" for a group depend on what is inserted into it.
2042// First item that has an associated languages determines the language for the whole group.
2044{
2045 if (getLanguage()==SrcLangExt::Unknown && d->getLanguage()!=SrcLangExt::Unknown)
2046 {
2048 }
2049}
2050
2052{
2053 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
2054 return ((!briefDescription().isEmpty() && repeatBrief) ||
2055 !documentation().isEmpty() ||
2056 !inbodyDocumentation().isEmpty()) &&
2057 (m_pages.size()!=numDocMembers());
2058}
2059
2061{
2063}
2064
2066{
2067 return m_hasGroupGraph;
2068}
2069
2070// --- Cast functions
2071
2073{
2074 if (d==nullptr) return nullptr;
2075 if (d && typeid(*d)==typeid(GroupDefImpl))
2076 {
2077 return static_cast<GroupDef*>(d);
2078 }
2079 else
2080 {
2081 return nullptr;
2082 }
2083}
2084
2086{
2087 if (d==nullptr) return nullptr;
2088 if (d && typeid(*d)==typeid(GroupDefImpl))
2089 {
2090 return static_cast<const GroupDef*>(d);
2091 }
2092 else
2093 {
2094 return nullptr;
2095 }
2096}
2097
2098
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: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: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
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:1947
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
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:3884
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:4726
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:4813
void createSubDirs(const Dir &d)
Definition util.cpp:3561
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:1956
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:3833
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:4823
A bunch of utility functions.