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 QCString groupTitleAsText() const override { return m_titleAsText; }
67 void setGroupTitle( const QCString &newtitle ) override;
68 bool hasGroupTitle( ) const override { return m_titleSet; }
69 void addFile(FileDef *def) override;
70 bool containsFile(const FileDef *def) const override;
71 bool addClass(ClassDef *def) override;
72 bool addConcept(ConceptDef *def) override;
73 bool addModule(ModuleDef *def) override;
74 bool addNamespace(NamespaceDef *def) override;
75 void addGroup(GroupDef *def) override;
76 void addPage(PageDef *def) override;
77 void addExample(PageDef *def) override;
78 void addDir(DirDef *dd) override;
79 bool insertMember(MemberDef *def,bool docOnly=FALSE) override;
80 void removeMember(MemberDef *md) override;
81 bool findGroup(const GroupDef *def) const override; // true if def is a subgroup of this group
82 void writeDocumentation(OutputList &ol) override;
83 void writeMemberPages(OutputList &ol, int hierarchyLevel) override;
84 void writeQuickMemberLinks(OutputList &ol,const MemberDef *currentMd) const override;
85 void writeTagFile(TextStream &) override;
86 size_t numDocMembers() const override;
87 bool isLinkableInProject() const override;
88 bool isLinkable() const override;
89 bool isVisibleInHierarchy() const override;
90 bool isASubGroup() const override;
91 void computeAnchors() override;
92 void countMembers() override;
93
94 void addMembersToMemberGroup() override;
96 void findSectionsInDocumentation() override;
97
98 void addListReferences() override;
99 void addRequirementReferences() override;
100 void sortMemberLists() override;
101 bool subGrouping() const override { return m_subGrouping; }
102
103 void setGroupScope(Definition *d) override { m_groupScope = d; }
104 Definition *getGroupScope() const override { return m_groupScope; }
105
106 MemberList *getMemberList(MemberListType lt) const override;
107 const MemberLists &getMemberLists() const override { return m_memberLists; }
108
109 /* user defined member groups */
110 const MemberGroupList &getMemberGroups() const override { return m_memberGroups; }
111
112 const FileList &getFiles() const override { return m_fileList; }
113 const ClassLinkedRefMap &getClasses() const override { return m_classes; }
114 const ConceptLinkedRefMap &getConcepts() const override { return m_concepts; }
115 const ModuleLinkedRefMap &getModules() const override { return m_modules; }
116 const NamespaceLinkedRefMap &getNamespaces() const override { return m_namespaces; }
117 const GroupList &getSubGroups() const override { return m_groups; }
118 const PageLinkedRefMap &getPages() const override { return m_pages; }
119 const DirList & getDirs() const override { return m_dirList; }
120 const PageLinkedRefMap &getExamples() const override { return m_examples; }
121 bool hasDetailedDescription() const override;
122 void sortSubGroups() override;
123 void writeSummaryLinks(OutputList &ol) const override;
124 void writePageNavigation(OutputList &ol) const override;
125
126 bool hasGroupGraph() const override;
127 void overrideGroupGraph(bool e) override;
128 private:
129 void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
134 void writeGroupGraph(OutputList &ol);
135 void writeFiles(OutputList &ol,const QCString &title);
136 void writeNamespaces(OutputList &ol,const QCString &title);
137 void writeNestedGroups(OutputList &ol,const QCString &title);
138 void writeDirs(OutputList &ol,const QCString &title);
139 void writeClasses(OutputList &ol,const QCString &title);
140 void writeConcepts(OutputList &ol,const QCString &title);
141 void writeModules(OutputList &ol,const QCString &title);
144 void writeDetailedDescription(OutputList &ol,const QCString &title);
152 void updateLanguage(const Definition *);
153 void setGroupTitleLocal( const QCString &title);
154
155 QCString m_title; // title of the group
156 QCString m_titleAsText; // title of the group in plain text
157 bool m_titleSet; // true if title is not the same as the name
158 QCString m_fileName; // base name of the generated file
159 FileList m_fileList; // list of files in the group
160 ClassLinkedRefMap m_classes; // list of classes in the group
161 ConceptLinkedRefMap m_concepts; // list of concepts in the group
162 ModuleLinkedRefMap m_modules; // list of modules in the group
163 NamespaceLinkedRefMap m_namespaces; // list of namespaces in the group
164 GroupList m_groups; // list of sub groups.
165 PageLinkedRefMap m_pages; // list of pages in the group
166 PageLinkedRefMap m_examples; // list of examples in the group
167 DirList m_dirList; // list of directories in the group
174 bool m_hasGroupGraph = false;
175
176};
177
178std::unique_ptr<GroupDef> createGroupDef(const QCString &fileName,int line,const QCString &name,
179 const QCString &title,const QCString &refFileName)
180{
181 return std::make_unique<GroupDefImpl>(fileName,line,name,title,refFileName);
182}
183
184
185//---------------------------------------------------------------------------
186
187GroupDefImpl::GroupDefImpl(const QCString &df,int dl,const QCString &na,const QCString &t,
188 const QCString &refFileName) : DefinitionMixin(df,dl,1,na),
190{
191 if (!refFileName.isEmpty())
192 {
193 m_fileName=stripExtension(refFileName);
194 }
195 else
196 {
197 m_fileName = convertNameToFile(QCString("group_")+na);
198 }
200
201 //visited = 0;
202 m_groupScope = nullptr;
203 m_subGrouping=Config_getBool(SUBGROUPING);
204 m_hasGroupGraph=Config_getBool(GROUP_GRAPHS);
205}
206
210
212{
213 if ( !t.isEmpty())
214 {
215 m_title = t;
216 m_titleAsText = parseCommentAsText(this,nullptr,t,docFile(),docLine());
218 }
219 else
220 {
221 m_title = name();
222 m_title[0]=static_cast<char>(toupper(m_title[0]));
225 }
226}
227
229{
231}
232
233
235{
236 for (const auto &mg : m_memberGroups)
237 {
238 mg->distributeMemberGroupDocumentation();
239 }
240}
241
243{
247
248 for (const auto &mg : m_memberGroups)
249 {
250 mg->findSectionsInDocumentation(this);
251 }
252
253 for (auto &ml : m_memberLists)
254 {
255 if (ml->listType().isDeclaration())
256 {
257 ml->findSectionsInDocumentation(this);
258 }
259 }
260}
261
263{
264 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
265 if (def->isHidden()) return;
266 updateLanguage(def);
267 if (sortBriefDocs)
268 m_fileList.insert( std::upper_bound( m_fileList.begin(), m_fileList.end(), def,
269 [](const auto &fd1, const auto &fd2)
270 { return qstricmp_sort(fd1->name(),fd2->name())<0; }),
271 def);
272 else
273 m_fileList.push_back(def);
274}
275
277{
278 return std::find(m_fileList.cbegin(),m_fileList.cend(), def) != m_fileList.cend();
279}
280
282{
283 if (cd->isHidden()) return FALSE;
284 updateLanguage(cd);
285 QCString qn = cd->name();
286 if (m_classes.find(qn)==nullptr)
287 {
288 m_classes.add(qn,cd);
289 return TRUE;
290 }
291 return FALSE;
292}
293
295{
296 if (cd->isHidden()) return FALSE;
297 QCString qn = cd->name();
298 if (m_concepts.find(qn)==nullptr)
299 {
300 m_concepts.add(qn,cd);
301 return TRUE;
302 }
303 return FALSE;
304}
305
307{
308 if (mod->isHidden()) return false;
309 QCString qn = mod->name();
310 if (m_modules.find(qn)==nullptr)
311 {
312 m_modules.add(qn,mod);
313 return true;
314 }
315 return false;
316}
317
319{
320 //printf("adding namespace hidden=%d\n",def->isHidden());
321 if (def->isHidden()) return false;
322 if (m_namespaces.find(def->name())==nullptr)
323 {
324 updateLanguage(def);
325 m_namespaces.add(def->name(),def);
326 return true;
327 }
328 return false;
329}
330
332{
333 if (def->isHidden()) return;
334 m_dirList.push_back(def);
335}
336
338{
339 if (def->isHidden()) return;
340 //printf("Making page %s part of a group\n",qPrint(def->name));
341 m_pages.add(def->name(),def);
342 def->makePartOfGroup(this);
343}
344
346{
347 if (def->isHidden()) return;
348 m_examples.add(def->name(),def);
349}
350
351
353{
354 for (auto &ml : m_memberLists)
355 {
356 if (ml->listType().isDeclaration())
357 {
359 }
360 }
361}
362
363
365{
366 if (md->isHidden()) return FALSE;
367 updateLanguage(md);
368 //printf("GroupDef(%s)::insertMember(%s)\n", qPrint(title), qPrint(md->name()));
370 for (auto &srcMi : *mni)
371 {
372 const MemberDef *srcMd = srcMi->memberDef();
373 if (srcMd==md) return FALSE; // already added before!
374
375 bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
376 // both inside a file => definition and declaration do not have to be in the same file
379
380 const ArgumentList &srcMdAl = srcMd->argumentList();
381 const ArgumentList &mdAl = md->argumentList();
382 const ArgumentList &tSrcMdAl = srcMd->templateArguments();
383 const ArgumentList &tMdAl = md->templateArguments();
384
385 if (srcMd->isFunction() && md->isFunction() && // both are a function
386 (tSrcMdAl.size()==tMdAl.size()) && // same number of template arguments
387 matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMd->typeString(),&srcMdAl,
388 md->getOuterScope(), md->getFileDef(), md->typeString(),&mdAl,
389 TRUE,srcMd->getLanguage()
390 ) && // matching parameters
391 sameScope // both are found in the same scope
392 )
393 {
395 if (mdm && srcMd->getGroupAlias()==nullptr)
396 {
397 mdm->setGroupAlias(srcMd);
398 }
399 else if (mdm && md!=srcMd->getGroupAlias())
400 {
401 mdm->setGroupAlias(srcMd->getGroupAlias());
402 }
403 return FALSE; // member is the same as one that is already added
404 }
405 }
406 mni->push_back(std::make_unique<MemberInfo>(md,md->protection(),md->virtualness(),false,false));
407 //printf("Added member!\n");
408 m_allMemberList.push_back(md);
409 switch(md->memberType())
410 {
412 if (!docOnly)
413 {
414 addMemberToList(MemberListType::DecVarMembers(),md);
415 }
416 addMemberToList(MemberListType::DocVarMembers(),md);
417 break;
419 if (!docOnly)
420 {
421 addMemberToList(MemberListType::DecFuncMembers(),md);
422 }
423 addMemberToList(MemberListType::DocFuncMembers(),md);
424 break;
426 if (!docOnly)
427 {
428 addMemberToList(MemberListType::DecTypedefMembers(),md);
429 }
430 addMemberToList(MemberListType::DocTypedefMembers(),md);
431 break;
433 if (!docOnly)
434 {
435 addMemberToList(MemberListType::DecEnumMembers(),md);
436 }
437 addMemberToList(MemberListType::DocEnumMembers(),md);
438 break;
440 if (!docOnly)
441 {
442 addMemberToList(MemberListType::DecEnumValMembers(),md);
443 }
444 addMemberToList(MemberListType::DocEnumValMembers(),md);
445 break;
447 if (!docOnly)
448 {
449 addMemberToList(MemberListType::DecDefineMembers(),md);
450 }
451 addMemberToList(MemberListType::DocDefineMembers(),md);
452 break;
454 if (!docOnly)
455 {
456 addMemberToList(MemberListType::DecSignalMembers(),md);
457 }
458 addMemberToList(MemberListType::DocSignalMembers(),md);
459 break;
460 case MemberType::Slot:
461 if (md->protection()==Protection::Public)
462 {
463 if (!docOnly)
464 {
465 addMemberToList(MemberListType::DecPubSlotMembers(),md);
466 }
467 addMemberToList(MemberListType::DocPubSlotMembers(),md);
468 }
469 else if (md->protection()==Protection::Protected)
470 {
471 if (!docOnly)
472 {
473 addMemberToList(MemberListType::DecProSlotMembers(),md);
474 }
475 addMemberToList(MemberListType::DocProSlotMembers(),md);
476 }
477 else
478 {
479 if (!docOnly)
480 {
481 addMemberToList(MemberListType::DecPriSlotMembers(),md);
482 }
483 addMemberToList(MemberListType::DocPriSlotMembers(),md);
484 }
485 break;
487 if (!docOnly)
488 {
489 addMemberToList(MemberListType::DecEventMembers(),md);
490 }
491 addMemberToList(MemberListType::DocEventMembers(),md);
492 break;
494 if (!docOnly)
495 {
496 addMemberToList(MemberListType::DecPropMembers(),md);
497 }
498 addMemberToList(MemberListType::DocPropMembers(),md);
499 break;
501 if (!docOnly)
502 {
503 addMemberToList(MemberListType::DecFriendMembers(),md);
504 }
505 addMemberToList(MemberListType::DocFriendMembers(),md);
506 break;
507 default:
508 err("GroupDefImpl::insertMembers(): "
509 "member '{}' (typeid='{}') with scope '{}' inserted in group scope '{}'!\n",
510 md->name(),md->memberTypeName(),
511 md->getClassDef() ? md->getClassDef()->name() : "",
512 name());
513 }
514 return TRUE;
515}
516
518{
519 // fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", qPrint(title), qPrint(md->name()));
521 if (mni)
522 {
524
525 removeMemberFromList(MemberListType::AllMembersList(),md);
526 switch(md->memberType())
527 {
529 removeMemberFromList(MemberListType::DecVarMembers(),md);
530 removeMemberFromList(MemberListType::DocVarMembers(),md);
531 break;
533 removeMemberFromList(MemberListType::DecFuncMembers(),md);
534 removeMemberFromList(MemberListType::DocFuncMembers(),md);
535 break;
537 removeMemberFromList(MemberListType::DecTypedefMembers(),md);
538 removeMemberFromList(MemberListType::DocTypedefMembers(),md);
539 break;
541 removeMemberFromList(MemberListType::DecEnumMembers(),md);
542 removeMemberFromList(MemberListType::DocEnumMembers(),md);
543 break;
545 removeMemberFromList(MemberListType::DecEnumValMembers(),md);
546 removeMemberFromList(MemberListType::DocEnumValMembers(),md);
547 break;
549 removeMemberFromList(MemberListType::DecDefineMembers(),md);
550 removeMemberFromList(MemberListType::DocDefineMembers(),md);
551 break;
553 removeMemberFromList(MemberListType::DecSignalMembers(),md);
554 removeMemberFromList(MemberListType::DocSignalMembers(),md);
555 break;
556 case MemberType::Slot:
557 if (md->protection()==Protection::Public)
558 {
559 removeMemberFromList(MemberListType::DecPubSlotMembers(),md);
560 removeMemberFromList(MemberListType::DocPubSlotMembers(),md);
561 }
562 else if (md->protection()==Protection::Protected)
563 {
564 removeMemberFromList(MemberListType::DecProSlotMembers(),md);
565 removeMemberFromList(MemberListType::DocProSlotMembers(),md);
566 }
567 else
568 {
569 removeMemberFromList(MemberListType::DecPriSlotMembers(),md);
570 removeMemberFromList(MemberListType::DocPriSlotMembers(),md);
571 }
572 break;
574 removeMemberFromList(MemberListType::DecEventMembers(),md);
575 removeMemberFromList(MemberListType::DocEventMembers(),md);
576 break;
578 removeMemberFromList(MemberListType::DecPropMembers(),md);
579 removeMemberFromList(MemberListType::DocPropMembers(),md);
580 break;
582 removeMemberFromList(MemberListType::DecFriendMembers(),md);
583 removeMemberFromList(MemberListType::DocFriendMembers(),md);
584 break;
585 default:
586 err("GroupDefImpl::removeMember(): unexpected member remove in file!\n");
587 }
588 }
589}
590
591bool GroupDefImpl::findGroup(const GroupDef *def) const
592{
593 if (this==def)
594 {
595 return TRUE;
596 }
597 for (const auto &gd : m_groups)
598 {
599 if (gd->findGroup(def))
600 {
601 return TRUE;
602 }
603 }
604 return FALSE;
605}
606
608{
609 //printf("adding group '%s' to group '%s'\n",qPrint(def->name()),qPrint(name()));
610 //if (Config_getBool(SORT_MEMBER_DOCS))
611 // groupList->inSort(def);
612 //else
613 m_groups.push_back(def);
614}
615
617{
618 return !partOfGroups().empty();
619}
620
622{
623 for (auto &ml : m_memberLists)
624 {
625 ml->countDecMembers();
626 ml->countDocMembers();
627 }
628 for (const auto &mg : m_memberGroups)
629 {
630 mg->countDecMembers();
631 mg->countDocMembers();
632 }
633}
634
636{
637 return m_fileList.size()+
638 m_classes.size()+
639 m_namespaces.size()+
640 m_groups.size()+
641 m_allMemberList.size()+
642 m_pages.size()+
643 m_examples.size();
644}
645
646/*! Compute the HTML anchor names for all members in the group */
648{
649 //printf("GroupDefImpl::computeAnchors()\n");
650 m_allMemberList.setAnchors();
651}
652
654{
657 tagFile << " <compound kind=\"group\">\n";
658 tagFile << " <name>" << convertToXML(name()) << "</name>\n";
659 tagFile << " <title>" << convertToXML(m_titleAsText) << "</title>\n";
660 tagFile << " <filename>" << fn << "</filename>\n";
661 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
662 {
663 switch (lde->kind())
664 {
665 case LayoutDocEntry::GroupClasses:
666 {
667 for (const auto &cd : m_classes)
668 {
669 if (cd->isLinkableInProject())
670 {
671 tagFile << " <class kind=\"" << cd->compoundTypeString()
672 << "\">" << convertToXML(cd->name()) << "</class>\n";
673 }
674 }
675 }
676 break;
677 case LayoutDocEntry::GroupConcepts:
678 {
679 for (const auto &cd : m_concepts)
680 {
681 if (cd->isLinkableInProject())
682 {
683 tagFile << " <concept>" << convertToXML(cd->name())
684 << "</concept>\n";
685 }
686 }
687 }
688 break;
689 case LayoutDocEntry::GroupModules:
690 {
691 for (const auto &mod : m_modules)
692 {
693 if (mod->isLinkableInProject())
694 {
695 tagFile << " <module>" << convertToXML(mod->name())
696 << "</module>\n";
697 }
698 }
699 }
700 break;
701 case LayoutDocEntry::GroupNamespaces:
702 {
703 for (const auto &nd : m_namespaces)
704 {
705 if (nd->isLinkableInProject())
706 {
707 tagFile << " <namespace>" << convertToXML(nd->name())
708 << "</namespace>\n";
709 }
710 }
711 }
712 break;
713 case LayoutDocEntry::GroupFiles:
714 {
715 for (const auto &fd : m_fileList)
716 {
717 if (fd->isLinkableInProject())
718 {
719 tagFile << " <file>" << convertToXML(fd->name()) << "</file>\n";
720 }
721 }
722 }
723 break;
724 case LayoutDocEntry::GroupPageDocs:
725 {
726 for (const auto &pd : m_pages)
727 {
728 QCString pageName = pd->getOutputFileBase();
729 if (pd->isLinkableInProject())
730 {
731 tagFile << " <page>" << convertToXML(pageName) << "</page>\n";
732 }
733 }
734 }
735 break;
736 case LayoutDocEntry::GroupDirs:
737 {
738 for (const auto &dd : m_dirList)
739 {
740 if (dd->isLinkableInProject())
741 {
742 tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>\n";
743 }
744 }
745 }
746 break;
747 case LayoutDocEntry::GroupNestedGroups:
748 {
749 for (const auto &gd : m_groups)
750 {
751 if (gd->isVisible())
752 {
753 tagFile << " <subgroup>" << convertToXML(gd->name()) << "</subgroup>\n";
754 }
755 }
756 }
757 break;
758 case LayoutDocEntry::MemberDecl:
759 {
760 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
761 if (lmd)
762 {
763 MemberList * ml = getMemberList(lmd->type);
764 if (ml)
765 {
766 ml->writeTagFile(tagFile,true);
767 }
768 }
769 }
770 break;
771 case LayoutDocEntry::MemberGroups:
772 {
773 for (const auto &mg : m_memberGroups)
774 {
775 mg->writeTagFile(tagFile,true);
776 }
777 }
778 break;
779 default:
780 break;
781 }
782 }
784 tagFile << " </compound>\n";
785}
786
788{
790 {
792 if (m_pages.size()!=numDocMembers()) // not only pages -> classical layout
793 {
796 ol.writeRuler();
800 ol.writeAnchor(QCString(),"details");
802 }
803 else
804 {
805 ol.disableAllBut(OutputType::Man); // always print title for man page
806 }
807 ol.startGroupHeader("details");
808 ol.parseText(title);
809 ol.endGroupHeader();
811
812 // repeat brief description
813 ol.startTextBlock();
814 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
815 {
817 briefLine(),
818 this,
819 nullptr,
821 DocOptions());
822 }
823 // write separator between brief and details
824 if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
825 !documentation().isEmpty())
826 {
830 ol.enableAll();
833 ol.writeString("\n\n");
835 }
836
837 // write detailed documentation
838 if (!documentation().isEmpty())
839 {
840 ol.generateDoc(docFile(),
841 docLine(),
842 this,
843 nullptr,
844 documentation()+"\n",
845 DocOptions()
846 .setIndexWords(true));
847 }
848
849 // write inbody documentation
850 if (!inbodyDocumentation().isEmpty())
851 {
853 inbodyLine(),
854 this,
855 nullptr,
856 inbodyDocumentation()+"\n",
857 DocOptions()
858 .setIndexWords(true));
859 }
861 ol.endTextBlock();
862 }
863}
864
866{
868 {
869 auto parser { createDocParser() };
870 auto ast { validatingParseDoc(*parser.get(),
871 briefFile(),
872 briefLine(),
873 this,
874 nullptr,
876 DocOptions()
877 .setIndexWords(true)
878 .setSingleLine(true))
879 };
880 if (!ast->isEmpty())
881 {
882 ol.startParagraph();
885 ol.writeString(" - ");
887 ol.writeDoc(ast.get(),this,nullptr);
890 ol.writeString(" \n");
892
893 if (hasDetailedDescription() && m_pages.size()!=numDocMembers()) // group with non-page members
894 {
896 ol.startTextLink(QCString(),"details");
897 ol.parseText(theTranslator->trMore());
898 ol.endTextLink();
899 }
901 ol.endParagraph();
902 }
903 }
904 ol.writeSynopsis();
905}
906
908{
909 if (Config_getBool(HAVE_DOT) && m_hasGroupGraph /*&& Config_getBool(GROUP_GRAPHS)*/)
910 {
911 DotGroupCollaboration graph(this);
912 if (graph.isTooBig())
913 {
914 warn_uncond("Group dependency graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
915 name(), graph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
916 }
917 else if (!graph.isTrivial())
918 {
919 msg("Generating dependency graph for group {}\n",qualifiedName());
922 //ol.startParagraph();
924 ol.parseText(theTranslator->trCollaborationDiagram(m_title));
925 ol.endGroupCollaboration(graph);
926 //ol.endParagraph();
928 }
929 }
930}
931
933{
934 // write list of files
935 if (!m_fileList.empty())
936 {
937 ol.startMemberHeader("files");
938 ol.parseText(title);
939 ol.endMemberHeader();
940 ol.startMemberList();
941 for (const auto &fd : m_fileList)
942 {
943 if (!fd->hasDocumentation()) continue;
945 QCString anc = fd->anchor();
946 if (anc.isEmpty()) anc=fd->displayName(); else anc.prepend(fd->displayName()+"_");
948 ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
950 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),QCString(),fd->displayName());
952 if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
953 {
954 ol.startMemberDescription(fd->getOutputFileBase());
956 briefLine(),
957 fd,
958 nullptr,
959 fd->briefDescription(),
960 DocOptions()
961 .setSingleLine(true));
963 }
965 }
966 ol.endMemberList();
967 }
968}
969
971{
972 // write list of namespaces
973 m_namespaces.writeDeclaration(ol,title);
974}
975
977{
978 // write list of groups
979 int count=0;
980 for (const auto &gd : m_groups)
981 {
982 if (gd->isVisible()) count++;
983 }
984 if (count>0)
985 {
986 ol.startMemberHeader("groups");
987 ol.parseText(title);
988 ol.endMemberHeader();
989 ol.startMemberList();
990 for (const auto &gd : m_groups)
991 {
992 if (gd->isVisible())
993 {
994 if (!gd->hasDocumentation()) continue;
996 QCString anc = gd->anchor();
997 if (anc.isEmpty()) anc=gd->name(); else anc.prepend(gd->name()+"_");
1000 ol.writeObjectLink(gd->getReference(),gd->getOutputFileBase(),QCString(),gd->groupTitleAsText());
1002 if (!gd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
1003 {
1004 ol.startMemberDescription(gd->getOutputFileBase());
1006 briefLine(),
1007 gd,
1008 nullptr,
1009 gd->briefDescription(),
1010 DocOptions()
1011 .setSingleLine(true));
1013 }
1015 }
1016 }
1017 ol.endMemberList();
1018 }
1019}
1020
1022{
1023 // write list of directories
1024 if (!m_dirList.empty())
1025 {
1026 ol.startMemberHeader("dirs");
1027 ol.parseText(title);
1028 ol.endMemberHeader();
1029 ol.startMemberList();
1030 for(const auto dd : m_dirList)
1031 {
1032 if (!dd->hasDocumentation()) continue;
1034 QCString anc = dd->anchor();
1035 if (anc.isEmpty()) anc=dd->shortName(); else anc.prepend(dd->shortName()+"_");
1037 ol.parseText(theTranslator->trDir(FALSE,TRUE));
1038 ol.insertMemberAlign();
1039 ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),QCString(),dd->shortName());
1041 if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
1042 {
1043 ol.startMemberDescription(dd->getOutputFileBase());
1045 briefLine(),
1046 dd,
1047 nullptr,
1048 dd->briefDescription(),
1049 DocOptions()
1050 .setSingleLine(true));
1052 }
1054 }
1055
1056 ol.endMemberList();
1057 }
1058}
1059
1061{
1062 // write list of classes
1063 m_classes.writeDeclaration(ol,nullptr,title,FALSE);
1064}
1065
1067{
1068 // write list of concepts
1069 m_concepts.writeDeclaration(ol,title,FALSE);
1070}
1071
1073{
1074 // write list of modules
1075 m_modules.writeDeclaration(ol,title,FALSE);
1076}
1077
1078
1080{
1081 m_classes.writeDocumentation(ol);
1082}
1083
1085{
1086 for (const auto *pd : m_pages)
1087 {
1088 if (!pd->isReference())
1089 {
1090 const SectionInfo *si=nullptr;
1091 if (pd->hasTitle() && !pd->name().isEmpty() &&
1092 (si=SectionManager::instance().find(pd->name()))!=nullptr)
1093 {
1095 ol.docify(si->title());
1097 }
1098 ol.startTextBlock();
1099 ol.generateDoc(pd->docFile(),
1100 pd->docLine(),
1101 pd,
1102 nullptr,
1103 (pd->documentation()+pd->inbodyDocumentation()),
1104 DocOptions()
1105 .setIndexWords(true));
1106 ol.endTextBlock();
1107 }
1108 }
1109}
1110
1112{
1113 /* write user defined member groups */
1114 for (const auto &mg : m_memberGroups)
1115 {
1116 mg->writeDeclarations(ol,nullptr,nullptr,nullptr,this,nullptr);
1117 }
1118}
1119
1124
1129
1131{
1132 //printf("** GroupDefImpl::startMemberDocumentation()\n");
1133 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1134 {
1135 ol.pushGeneratorState();
1138 }
1139}
1140
1142{
1143 //printf("** GroupDefImpl::endMemberDocumentation()\n");
1144 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1145 {
1146 ol.popGeneratorState();
1148 }
1149}
1150
1152{
1153 // write Author section (Man only)
1154 ol.pushGeneratorState();
1156 ol.startGroupHeader();
1157 ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
1158 ol.endGroupHeader();
1159 ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString(PROJECT_NAME)));
1160 ol.popGeneratorState();
1161}
1162
1164{
1165 ol.pushGeneratorState();
1167 bool first=TRUE;
1168 SrcLangExt lang = getLanguage();
1169 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1170 {
1171 if ((lde->kind()==LayoutDocEntry::GroupClasses && m_classes.declVisible()) ||
1172 (lde->kind()==LayoutDocEntry::GroupConcepts && m_concepts.declVisible()) ||
1173 (lde->kind()==LayoutDocEntry::GroupModules && m_modules.declVisible()) ||
1174 (lde->kind()==LayoutDocEntry::GroupNamespaces && m_namespaces.declVisible(false)) ||
1175 (lde->kind()==LayoutDocEntry::GroupFiles && !m_fileList.empty()) ||
1176 (lde->kind()==LayoutDocEntry::GroupNestedGroups && !m_groups.empty()) ||
1177 (lde->kind()==LayoutDocEntry::GroupDirs && !m_dirList.empty())
1178 )
1179 {
1180 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1181 if (ls)
1182 {
1183 QCString label = lde->kind()==LayoutDocEntry::GroupClasses ? "nested-classes" :
1184 lde->kind()==LayoutDocEntry::GroupConcepts ? "concepts" :
1185 lde->kind()==LayoutDocEntry::GroupModules ? "modules" :
1186 lde->kind()==LayoutDocEntry::GroupNamespaces ? "namespaces" :
1187 lde->kind()==LayoutDocEntry::GroupFiles ? "files" :
1188 lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups" :
1189 "dirs";
1190 ol.writeSummaryLink(QCString(),label,ls->title(lang),first);
1191 first=FALSE;
1192 }
1193 }
1194 else if (lde->kind()==LayoutDocEntry::MemberDecl)
1195 {
1196 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1197 if (lmd)
1198 {
1199 MemberList * ml = getMemberList(lmd->type);
1200 if (ml && ml->declVisible())
1201 {
1202 ol.writeSummaryLink(QCString(),ml->listType().toLabel(),lmd->title(lang),first);
1203 first=FALSE;
1204 }
1205 }
1206 }
1207 }
1208 if (!first)
1209 {
1210 ol.writeString(" </div>\n");
1211 }
1212 ol.popGeneratorState();
1213}
1214
1219
1221{
1222 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
1223 ol.pushGeneratorState();
1224
1225 // Find out how deep this group is nested. In case of multiple parents, use the first one.
1226 int hierarchyLevel = 0;
1227 const GroupDef *gd = this;
1228 while (!gd->partOfGroups().empty())
1229 {
1230 gd = gd->partOfGroups().front();
1231 ++hierarchyLevel;
1232 }
1233
1235 FALSE /* additionalIndices*/, QCString() /*altSidebarName*/, hierarchyLevel);
1236
1237 ol.startHeaderSection();
1238 bool writeOutlinePanel = generateTreeView && Config_getBool(PAGE_OUTLINE_PANEL);
1239 if (!writeOutlinePanel) writeSummaryLinks(ol);
1241 //1.{
1242 ol.pushGeneratorState();
1244 ol.generateDoc(docFile(),
1246 this,
1247 nullptr,
1248 m_title,
1249 DocOptions()
1250 .setIndexWords(true)
1251 .setSingleLine(true)
1252 .setAutolinkSupport(false));
1253 ol.popGeneratorState();
1254 //1.}
1255 addGroupListToTitle(ol,this);
1256 //2.{
1257 ol.pushGeneratorState();
1260 ol.popGeneratorState();
1261 //2.}
1262 //3.{
1263 ol.pushGeneratorState();
1266 if (!m_titleAsText.isEmpty())
1267 {
1268 ol.writeString(" - ");
1270 }
1271 ol.popGeneratorState();
1272 //3.}
1273 ol.endHeaderSection();
1274 ol.startContents();
1275
1276 //---------------------------------------- start flexible part -------------------------------
1277
1278 SrcLangExt lang=getLanguage();
1279 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group))
1280 {
1281 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
1282 switch (lde->kind())
1283 {
1284 case LayoutDocEntry::BriefDesc:
1286 break;
1287 case LayoutDocEntry::MemberDeclStart:
1289 break;
1290 case LayoutDocEntry::GroupClasses:
1291 if (ls) writeClasses(ol,ls->title(lang));
1292 break;
1293 case LayoutDocEntry::GroupConcepts:
1294 if (ls) writeConcepts(ol,ls->title(lang));
1295 break;
1296 case LayoutDocEntry::GroupModules:
1297 if (ls) writeModules(ol,ls->title(lang));
1298 break;
1299 case LayoutDocEntry::GroupInlineClasses:
1301 break;
1302 case LayoutDocEntry::GroupNamespaces:
1303 if (ls) writeNamespaces(ol,ls->title(lang));
1304 break;
1305 case LayoutDocEntry::MemberGroups:
1307 break;
1308 case LayoutDocEntry::MemberDecl:
1309 {
1310 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
1311 if (lmd)
1312 {
1313 writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
1314 }
1315 }
1316 break;
1317 case LayoutDocEntry::MemberDeclEnd:
1319 break;
1320 case LayoutDocEntry::DetailedDesc:
1321 if (ls) writeDetailedDescription(ol,ls->title(lang));
1322 break;
1323 case LayoutDocEntry::MemberDefStart:
1325 break;
1326 case LayoutDocEntry::MemberDef:
1327 {
1328 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
1329 if (lmd)
1330 {
1331 writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
1332 }
1333 }
1334 break;
1335 case LayoutDocEntry::MemberDefEnd:
1337 break;
1338 case LayoutDocEntry::GroupNestedGroups:
1339 if (ls) writeNestedGroups(ol,ls->title(lang));
1340 break;
1341 case LayoutDocEntry::GroupPageDocs:
1343 break;
1344 case LayoutDocEntry::GroupDirs:
1345 if (ls) writeDirs(ol,ls->title(lang));
1346 break;
1347 case LayoutDocEntry::GroupFiles:
1348 if (ls) writeFiles(ol,ls->title(lang));
1349 break;
1350 case LayoutDocEntry::GroupGraph:
1351 writeGroupGraph(ol);
1352 break;
1353 case LayoutDocEntry::AuthorSection:
1355 break;
1356 case LayoutDocEntry::ClassIncludes:
1357 case LayoutDocEntry::ClassInheritanceGraph:
1358 case LayoutDocEntry::ClassNestedClasses:
1359 case LayoutDocEntry::ClassCollaborationGraph:
1360 case LayoutDocEntry::ClassAllMembersLink:
1361 case LayoutDocEntry::ClassUsedFiles:
1362 case LayoutDocEntry::ClassInlineClasses:
1363 case LayoutDocEntry::NamespaceNestedNamespaces:
1364 case LayoutDocEntry::NamespaceNestedConstantGroups:
1365 case LayoutDocEntry::NamespaceClasses:
1366 case LayoutDocEntry::NamespaceConcepts:
1367 case LayoutDocEntry::NamespaceInterfaces:
1368 case LayoutDocEntry::NamespaceStructs:
1369 case LayoutDocEntry::NamespaceExceptions:
1370 case LayoutDocEntry::NamespaceInlineClasses:
1371 case LayoutDocEntry::ConceptDefinition:
1372 case LayoutDocEntry::FileClasses:
1373 case LayoutDocEntry::FileConcepts:
1374 case LayoutDocEntry::FileInterfaces:
1375 case LayoutDocEntry::FileStructs:
1376 case LayoutDocEntry::FileExceptions:
1377 case LayoutDocEntry::FileNamespaces:
1378 case LayoutDocEntry::FileConstantGroups:
1379 case LayoutDocEntry::FileIncludes:
1380 case LayoutDocEntry::FileIncludeGraph:
1381 case LayoutDocEntry::FileIncludedByGraph:
1382 case LayoutDocEntry::FileSourceLink:
1383 case LayoutDocEntry::FileInlineClasses:
1384 case LayoutDocEntry::ModuleExports:
1385 case LayoutDocEntry::ModuleClasses:
1386 case LayoutDocEntry::ModuleConcepts:
1387 case LayoutDocEntry::ModuleUsedFiles:
1388 case LayoutDocEntry::DirSubDirs:
1389 case LayoutDocEntry::DirFiles:
1390 case LayoutDocEntry::DirGraph:
1391 err("Internal inconsistency: member '{}' should not be part of "
1392 "LayoutDocManager::Group entry list\n",lde->entryToString());
1393 break;
1394 }
1395 }
1396
1397 //---------------------------------------- end flexible part -------------------------------
1398
1399 for (auto &subgd : getSubGroups())
1400 {
1401 if (!subgd->isReference())
1402 {
1403 if (subgd->partOfGroups().front() == this)
1404 {
1405 ol.writePageLink(subgd->getOutputFileBase(), FALSE);
1406 }
1407 else
1408 {
1409 // Could write a note explaining that the subgroup belongs to another
1410 // group and add a link here.
1411 }
1412 }
1413 }
1414 if (generateTreeView && Config_getBool(PAGE_OUTLINE_PANEL))
1415 {
1416 ol.pushGeneratorState();
1418 ol.endContents();
1419 ol.writeString("</div><!-- doc-content -->\n");
1421 ol.writeString("</div><!-- container -->\n");
1422 ol.popGeneratorState();
1423 endFile(ol,true,true);
1424 }
1425 else
1426 {
1427 endFile(ol);
1428 }
1429
1430 ol.popGeneratorState();
1431
1432 if (Config_getBool(SEPARATE_MEMBER_PAGES))
1433 {
1434 m_allMemberList.sort();
1435 writeMemberPages(ol, hierarchyLevel + 1);
1436 }
1437}
1438
1439void GroupDefImpl::writeMemberPages(OutputList &ol, int hierarchyLevel)
1440{
1441 ol.pushGeneratorState();
1443
1444 for (const auto &ml : m_memberLists)
1445 {
1446 if (ml->listType().isDocumentation())
1447 {
1448 ml->writeDocumentationPage(ol,name(),this,hierarchyLevel);
1449 }
1450 }
1451
1452 ol.popGeneratorState();
1453}
1454
1456{
1457 bool createSubDirs=Config_getBool(CREATE_SUBDIRS);
1458
1459 ol.writeString(" <div class=\"navtab\">\n");
1460 ol.writeString(" <table>\n");
1461
1462 for (const auto *md : m_allMemberList)
1463 {
1464 if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
1465 {
1466 if (md->isLinkableInProject())
1467 {
1468 QCString fn = md->getOutputFileBase();
1470 if (md==currentMd) // selected item => highlight
1471 {
1472 ol.writeString(" <tr><td class=\"navtabHL\">");
1473 }
1474 else
1475 {
1476 ol.writeString(" <tr><td class=\"navtab\">");
1477 }
1478 ol.writeString("<span class=\"label\"><a ");
1479 ol.writeString("href=\"");
1480 if (createSubDirs) ol.writeString("../../");
1481 ol.writeString(fn+"#"+md->anchor());
1482 ol.writeString("\">");
1483 ol.writeString(convertToHtml(md->localName()));
1484 ol.writeString("</a></span>");
1485 ol.writeString("</td></tr>\n");
1486 }
1487 }
1488 }
1489 ol.writeString(" </table>\n");
1490 ol.writeString(" </div>\n");
1491}
1492
1493
1494
1495//---- helper functions ------------------------------------------------------
1496
1497void addClassToGroups(const Entry *root,ClassDef *cd)
1498{
1499 for (const Grouping &g : root->groups)
1500 {
1501 GroupDef *gd=nullptr;
1502 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1503 if (gd && gd->addClass(cd))
1504 {
1506 if (cdm)
1507 {
1508 cdm->makePartOfGroup(gd);
1509 }
1510 //printf("Compound %s: in group %s\n",qPrint(cd->name()),gd->groupTitle());
1511 }
1512 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1513 {
1514 warn(root->fileName, root->startLine,
1515 "Found non-existing group '{}' for the command '{}', ignoring command",
1517 );
1518 }
1519 }
1520}
1521
1523{
1524 for (const Grouping &g : root->groups)
1525 {
1527 if (gd && gd->addConcept(cd))
1528 {
1530 if (cdm)
1531 {
1532 cdm->makePartOfGroup(gd);
1533 }
1534 //printf("Compound %s: in group %s\n",qPrint(cd->name()),gd->groupTitle());
1535 }
1536 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1537 {
1538 warn(root->fileName, root->startLine,
1539 "Found non-existing group '{}' for the command '{}', ignoring command",
1541 );
1542 }
1543 }
1544}
1545
1546void addModuleToGroups(const Entry *root,ModuleDef *mod)
1547{
1548 for (const Grouping &g : root->groups)
1549 {
1551 if (gd && gd->addModule(mod))
1552 {
1553 mod->makePartOfGroup(gd);
1554 //printf("Module %s: in group %s\n",qPrint(mod->name()),gd->groupTitle());
1555 }
1556 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1557 {
1558 warn(root->fileName, root->startLine,
1559 "Found non-existing group '{}' for the command '{}', ignoring command",
1561 );
1562 }
1563 }
1564}
1565
1566
1568{
1569 //printf("root->groups.size()=%zu\n",root->groups.size());
1570 for (const Grouping &g : root->groups)
1571 {
1572 GroupDef *gd=nullptr;
1573 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1574 //printf("group '%s' gd=%p\n",qPrint(g.groupname),(void*)gd);
1575 if (gd && gd->addNamespace(nd))
1576 {
1578 if (ndm)
1579 {
1580 ndm->makePartOfGroup(gd);
1581 }
1582 //printf("Namespace %s: in group %s\n",qPrint(nd->name()),qPrint(gd->name()));
1583 }
1584 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1585 {
1586 warn(root->fileName, root->startLine,
1587 "Found non-existing group '{}' for the command '{}', ignoring command",
1589 );
1590 }
1591 }
1592}
1593
1594void addDirToGroups(const Entry *root,DirDef *dd)
1595{
1596 //printf("*** root->groups.size()=%d\n",root->groups.size());
1597 for (const Grouping &g : root->groups)
1598 {
1600 //printf("group '%s'\n",qPrint(g->groupname));
1601 if (gd)
1602 {
1603 gd->addDir(dd);
1604 dd->makePartOfGroup(gd);
1605 //printf("Dir %s: in group %s\n",qPrint(dd->name()),qPrint(g->groupname));
1606 }
1607 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1608 {
1609 warn(root->fileName, root->startLine,
1610 "Found non-existing group '{}' for the command '{}', ignoring command",
1612 );
1613 }
1614 }
1615}
1616
1617void addGroupToGroups(const Entry *root,GroupDef *subGroup)
1618{
1619 //printf("addGroupToGroups for %s groups=%d\n",qPrint(root->name),root->groups.size());
1620 for (const Grouping &g : root->groups)
1621 {
1623 if (gd)
1624 {
1625 if (gd==subGroup)
1626 {
1627 warn(root->fileName,root->startLine,"Refusing to add group {} to itself",
1628 gd->name());
1629 }
1630 else if (subGroup->findGroup(gd))
1631 {
1632 warn(root->fileName,root->startLine,"Refusing to add group {} to group {}, since the latter is already a "
1633 "subgroup of the former", subGroup->name(),gd->name());
1634 }
1635 else if (!gd->findGroup(subGroup))
1636 {
1637 gd->addGroup(subGroup);
1638 subGroup->makePartOfGroup(gd);
1639 }
1640 }
1641 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1642 {
1643 warn(root->fileName, root->startLine,
1644 "Found non-existing group '{}' for the command '{}', ignoring command",
1646 );
1647 }
1648 }
1649}
1650
1651/*! Add a member to the group with the highest priority */
1652void addMemberToGroups(const Entry *root,MemberDef *md)
1653{
1654 //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%zu\n",
1655 // root, qPrint(root->name), md, qPrint(md->name()), root->groups.size() );
1656
1657 // Search entry's group list for group with highest pri.
1659 GroupDef *fgd=nullptr;
1660 for (const Grouping &g : root->groups)
1661 {
1662 GroupDef *gd=nullptr;
1663 if (!g.groupname.isEmpty()) gd=Doxygen::groupLinkedMap->find(g.groupname);
1664 if (gd && g.pri >= pri)
1665 {
1666 if (fgd && gd!=fgd && g.pri==pri)
1667 {
1668 warn(root->fileName, root->startLine,
1669 "Member {} found in multiple {} groups! "
1670 "The member will be put in group {}, and not in group {}",
1671 md->name(), Grouping::getGroupPriName( pri ),
1672 gd->name(), fgd->name()
1673 );
1674 }
1675
1676 fgd = gd;
1677 pri = g.pri;
1678 }
1679 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1680 {
1681 warn(root->fileName, root->startLine,
1682 "Found non-existing group '{}' for the command '{}', ignoring command",
1684 );
1685 }
1686 }
1687 //printf("fgd=%p\n",fgd);
1688
1689 // put member into group defined by this entry?
1690 if (fgd)
1691 {
1692 GroupDef *mgd = md->getGroupDef();
1693 //printf("mgd=%p\n",mgd);
1694 bool insertit = FALSE;
1695 if (mgd==nullptr)
1696 {
1697 insertit = TRUE;
1698 }
1699 else if (mgd!=fgd)
1700 {
1701 bool moveit = FALSE;
1702
1703 // move member from one group to another if
1704 // - the new one has a higher priority
1705 // - the new entry has the same priority, but with docs where the old one had no docs
1706 if (md->getGroupPri()<pri)
1707 {
1708 moveit = TRUE;
1709 }
1710 else
1711 {
1712 if (md->getGroupPri()==pri)
1713 {
1714 if (!root->doc.isEmpty() && !md->getGroupHasDocs())
1715 {
1716 moveit = TRUE;
1717 }
1718 else if (!root->doc.isEmpty() && md->getGroupHasDocs())
1719 {
1721 "Member documentation for {} found several times in {} groups!\n"
1722 "{}:{}: The member will remain in group {}, and won't be put into group {}",
1723 md->name(), Grouping::getGroupPriName( pri ),
1724 root->fileName, root->startLine,
1725 mgd->name(), fgd->name()
1726 );
1727 }
1728 }
1729 }
1730
1731 if (moveit)
1732 {
1733 //printf("removeMember\n");
1734 mgd->removeMember(md);
1735 insertit = TRUE;
1736 }
1737 }
1738
1739 if (insertit)
1740 {
1741 //printf("insertMember found at %s line %d: %s: related %s\n",
1742 // qPrint(md->getDefFileName()),md->getDefLine(),
1743 // qPrint(md->name()),qPrint(root->relates));
1744 bool success = fgd->insertMember(md);
1745 if (success)
1746 {
1748 if (mdm)
1749 {
1750 //printf("insertMember successful\n");
1751 mdm->setGroupDef(fgd,pri,root->fileName,root->startLine,!root->doc.isEmpty());
1753 if (cdm)
1754 {
1755 cdm->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
1756 }
1757 if (mdm->isEnumerate() && mdm->getGroupDef() && md->isStrong())
1758 {
1759 for (const auto &emd : mdm->enumFieldList())
1760 {
1762 if (emdm && emdm->getGroupDef()==nullptr)
1763 {
1764 emdm->setGroupDef(mdm->getGroupDef(),mdm->getGroupPri(),
1765 mdm->getGroupFileName(),mdm->getGroupStartLine(),
1766 mdm->getGroupHasDocs());
1767 }
1768 }
1769 }
1770 }
1771 }
1772 }
1773 }
1774}
1775
1776
1777void addExampleToGroups(const Entry *root,PageDef *eg)
1778{
1779 for (const Grouping &g : root->groups)
1780 {
1782 if (gd)
1783 {
1784 gd->addExample(eg);
1785 eg->makePartOfGroup(gd);
1786 //printf("Example %s: in group %s\n",qPrint(eg->name()),s->data());
1787 }
1788 else if (!gd && g.pri == Grouping::GROUPING_INGROUP)
1789 {
1790 warn(root->fileName, root->startLine,
1791 "Found non-existing group '{}' for the command '{}', ignoring command",
1793 );
1794 }
1795 }
1796}
1797
1799{
1800 return m_fileName;
1801}
1802
1804{
1807 theTranslator->trGroup(TRUE,TRUE),
1809 QCString(),
1810 nullptr
1811 );
1812 for (const auto &mg : m_memberGroups)
1813 {
1814 mg->addListReferences(this);
1815 }
1816 for (auto &ml : m_memberLists)
1817 {
1818 if (ml->listType().isDocumentation())
1819 {
1820 ml->addListReferences(this);
1821 }
1822 }
1823}
1824
1826{
1828 for (const auto &mg : m_memberGroups)
1829 {
1830 mg->addRequirementReferences(this);
1831 }
1832 for (auto &ml : m_memberLists)
1833 {
1834 if (ml->listType().isDocumentation())
1835 {
1836 ml->addRequirementReferences(this);
1837 }
1838 }
1839}
1840
1842{
1843 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
1844 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
1845 const auto &ml = m_memberLists.get(lt,MemberListContainer::Group);
1846 ml->setNeedsSorting(
1847 (ml->listType().isDeclaration() && sortBriefDocs) ||
1848 (ml->listType().isDocumentation() && sortMemberDocs));
1849 ml->push_back(md);
1850}
1851
1852// performs a partial reordering to group elements together with the same scope
1853template<class Vec>
1854static void groupClassesWithSameScope(Vec &vec)
1855{
1856 bool done=false;
1857 while (!done) // for each iteration
1858 {
1859 done=true;
1860 for (size_t i=0; i<vec.size(); i++) // go through all items
1861 {
1862 std::string qni = vec[i]->name().str();
1863 size_t posi = qni.rfind("::");
1864 if (posi!=std::string::npos)
1865 {
1866 std::string scope = qni.substr(0,posi);
1867 auto it = std::find_if( vec.begin(), vec.end(),
1868 [&](typename Vec::Ptr &cd)
1869 { return cd->name().str()==scope; });
1870 if (it!=vec.end())
1871 {
1872 size_t idx = std::distance(vec.begin(),it);
1873 if (i<idx) // parent scope located after child scope
1874 {
1875 // to avoid reordering elements with the same parent
1876 // we skip to the last one with the same scope
1877 size_t k = idx;
1878 while (k<vec.size() && vec[k]->name().str().substr(0,posi)==scope)
1879 {
1880 idx = k;
1881 k++;
1882 }
1883 // swap the items such that i is inserted after idx
1884 for (size_t j=i; j<idx; j++)
1885 {
1886 std::swap(vec[j],vec[j+1]);
1887 }
1888 done=false;
1889 }
1890 else if (idx<i && vec[i-1]->name().str().substr(0,posi)!=scope)
1891 {
1892 // parent scope is found before the item, and the item
1893 // has some other item with a different scope in front of it
1894 // move idx to the end of range with the same scope
1895 while (idx<i && vec[idx]->name().str().substr(0,posi)==scope)
1896 {
1897 idx++;
1898 }
1899 // swap the items such that i is just after idx
1900 for (size_t j=idx; j<i; j++)
1901 {
1902 std::swap(vec[j],vec[j+1]);
1903 }
1904 done=false;
1905 }
1906 }
1907 }
1908 }
1909 }
1910}
1911
1913{
1914 for (auto &ml : m_memberLists)
1915 {
1916 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
1917 }
1918 if (Config_getBool(SORT_BRIEF_DOCS))
1919 {
1920 std::stable_sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
1921
1922 auto classComp = [](const ClassLinkedRefMap::Ptr &c1,const ClassLinkedRefMap::Ptr &c2)
1923 {
1924 return Config_getBool(SORT_BY_SCOPE_NAME) ?
1925 qstricmp_sort(c1->name(), c2->name())<0 :
1926 qstricmp_sort(c1->className(), c2->className())<0;
1927 };
1928 std::stable_sort(m_classes.begin(), m_classes.end(), classComp);
1929
1930 auto namespaceComp = [](const NamespaceLinkedRefMap::Ptr &n1,const NamespaceLinkedRefMap::Ptr &n2)
1931 {
1932 return qstricmp_sort(n1->name(),n2->name())<0;
1933 };
1934
1935 std::stable_sort(m_namespaces.begin(),m_namespaces.end(),namespaceComp);
1936
1937 auto moduleComp = [](const ModuleLinkedRefMap::Ptr &m1,const ModuleLinkedRefMap::Ptr &m2)
1938 {
1939 return qstricmp_sort(m1->name(),m2->name())<0;
1940 };
1941
1942 std::stable_sort(m_modules.begin(), m_modules.end(), moduleComp);
1943
1944 auto conceptComp = [](const ConceptLinkedRefMap::Ptr &c1,const ConceptLinkedRefMap::Ptr &c2)
1945 {
1946 return qstricmp_sort(c1->name(),c2->name())<0;
1947 };
1948
1949 std::stable_sort(m_concepts.begin(), m_concepts.end(), conceptComp);
1950
1951 std::stable_sort(m_dirList.begin(), m_dirList.end(), compareDirDefs);
1952 std::stable_sort(m_fileList.begin(), m_fileList.end(), compareFileDefs);
1953
1954 }
1955 else
1956 {
1959 }
1960}
1961
1963{
1964 for (auto &ml : m_memberLists)
1965 {
1966 if (ml->listType()==lt)
1967 {
1968 return ml.get();
1969 }
1970 }
1971 return nullptr;
1972}
1973
1975{
1976 bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1977
1978 MemberList * ml = getMemberList(lt);
1979 if (optimizeVhdl && ml)
1980 {
1981 VhdlDocGen::writeVhdlDeclarations(ml,ol,this,nullptr,nullptr,nullptr,nullptr);
1982 return;
1983 }
1984 if (ml)
1985 {
1986 ml->writeDeclarations(ol,nullptr,nullptr,nullptr,this,nullptr,title,QCString());
1987 }
1988}
1989
1991{
1992 MemberList * ml = getMemberList(lt);
1993 if (ml) ml->writeDocumentation(ol,name(),this,title,ml->listType().toLabel());
1994}
1995
1997{
1998 MemberList *ml = getMemberList(lt);
1999 if (ml) ml->remove(md);
2000}
2001
2003{
2004 std::stable_sort(m_groups.begin(),
2005 m_groups.end(),
2006 [](const auto &g1,const auto &g2)
2007 { return g1->groupTitle() < g2->groupTitle(); });
2008}
2009
2010static bool hasNonReferenceNestedGroupRec(const GroupDef *gd,int level)
2011{
2012 if (level>30)
2013 {
2014 err("Possible recursive group relation while inside {}\n",gd->name());
2015 return false;
2016 }
2017 bool found=gd->isLinkableInProject();
2018 if (found)
2019 {
2020 return true;
2021 }
2022 else
2023 {
2024 for (const auto &igd : gd->getSubGroups())
2025 {
2026 found = found || hasNonReferenceNestedGroupRec(igd,level+1);
2027 if (found) break;
2028 }
2029 }
2030 return found;
2031}
2032
2034{
2035 bool allExternals = Config_getBool(EXTERNAL_GROUPS);
2036 return (allExternals || hasNonReferenceNestedGroupRec(this,0)) && isLinkable();
2037}
2038
2040{
2041 return !isReference() && isLinkable();
2042}
2043
2045{
2046 return hasUserDocumentation();
2047}
2048
2049// let the "programming language" for a group depend on what is inserted into it.
2050// First item that has an associated languages determines the language for the whole group.
2052{
2053 if (getLanguage()==SrcLangExt::Unknown && d->getLanguage()!=SrcLangExt::Unknown)
2054 {
2056 }
2057}
2058
2060{
2061 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
2062 return ((!briefDescription().isEmpty() && repeatBrief) ||
2063 !documentation().isEmpty() ||
2064 !inbodyDocumentation().isEmpty() ||
2066}
2067
2069{
2071}
2072
2074{
2075 return m_hasGroupGraph;
2076}
2077
2078// --- Cast functions
2079
2081{
2082 if (d==nullptr) return nullptr;
2083 if (d && typeid(*d)==typeid(GroupDefImpl))
2084 {
2085 return static_cast<GroupDef*>(d);
2086 }
2087 else
2088 {
2089 return nullptr;
2090 }
2091}
2092
2094{
2095 if (d==nullptr) return nullptr;
2096 if (d && typeid(*d)==typeid(GroupDefImpl))
2097 {
2098 return static_cast<const GroupDef*>(d);
2099 }
2100 else
2101 {
2102 return nullptr;
2103 }
2104}
2105
2106
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:77
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
bool hasRequirementRefs() const override
QCString briefFile() const override
QCString qualifiedName() const override
void setLanguage(SrcLangExt lang) override
void writeRequirementRefs(OutputList &ol) const 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:180
Representation of a group collaboration graph.
static bool suppressDocWarnings
Definition doxygen.h:131
static GroupLinkedMap * groupLinkedMap
Definition doxygen.h:113
Represents an unstructured piece of information, about an entity found in the sources.
Definition entry.h:117
QCString fileName
file this entry was extracted from
Definition entry.h:224
std::vector< Grouping > groups
list of groups this entry belongs to
Definition entry.h:222
int startLine
start line of entry in the source
Definition entry.h:225
QCString doc
documentation block (partly parsed)
Definition entry.h:201
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:161
FileList m_fileList
Definition groupdef.cpp:159
const ModuleLinkedRefMap & getModules() const override
Definition groupdef.cpp:115
void endMemberDeclarations(OutputList &ol)
void startMemberDocumentation(OutputList &ol)
void setGroupScope(Definition *d) override
Definition groupdef.cpp:103
bool isLinkable() const override
bool addNamespace(NamespaceDef *def) override
Definition groupdef.cpp:318
Definition * getGroupScope() const override
Definition groupdef.cpp:104
bool hasGroupTitle() const override
Definition groupdef.cpp:68
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:970
bool findGroup(const GroupDef *def) const override
Definition groupdef.cpp:591
void writeDirs(OutputList &ol, const QCString &title)
~GroupDefImpl() override
Definition groupdef.cpp:207
QCString displayName(bool=TRUE) const override
Definition groupdef.cpp:64
void sortMemberLists() override
NamespaceLinkedRefMap m_namespaces
Definition groupdef.cpp:163
void writeInlineClasses(OutputList &ol)
CodeSymbolType codeSymbolType() const override
Definition groupdef.cpp:61
QCString groupTitleAsText() const override
Definition groupdef.cpp:66
const MemberGroupList & getMemberGroups() const override
Definition groupdef.cpp:110
void removeMember(MemberDef *md) override
Definition groupdef.cpp:517
void setGroupTitleLocal(const QCString &title)
Definition groupdef.cpp:211
void addPage(PageDef *def) override
Definition groupdef.cpp:337
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:616
bool subGrouping() const override
Definition groupdef.cpp:101
ModuleLinkedRefMap m_modules
Definition groupdef.cpp:162
GroupDefImpl(const QCString &fileName, int line, const QCString &name, const QCString &title, const QCString &refFileName=QCString())
Definition groupdef.cpp:187
void addGroup(GroupDef *def) override
Definition groupdef.cpp:607
void addDir(DirDef *dd) override
Definition groupdef.cpp:331
MemberGroupList m_memberGroups
Definition groupdef.cpp:172
bool addModule(ModuleDef *def) override
Definition groupdef.cpp:306
void addMembersToMemberGroup() override
Definition groupdef.cpp:352
PageLinkedRefMap m_examples
Definition groupdef.cpp:166
void writeTagFile(TextStream &) override
Definition groupdef.cpp:653
MemberList m_allMemberList
Definition groupdef.cpp:168
void writeGroupGraph(OutputList &ol)
Definition groupdef.cpp:907
bool isVisibleInHierarchy() const override
void writeAuthorSection(OutputList &ol)
void endMemberDocumentation(OutputList &ol)
DirList m_dirList
Definition groupdef.cpp:167
void sortSubGroups() override
QCString m_fileName
Definition groupdef.cpp:158
bool m_subGrouping
Definition groupdef.cpp:173
bool addClass(ClassDef *def) override
Definition groupdef.cpp:281
GroupList m_groups
Definition groupdef.cpp:164
void updateLanguage(const Definition *)
void findSectionsInDocumentation() override
Definition groupdef.cpp:242
const GroupList & getSubGroups() const override
Definition groupdef.cpp:117
bool insertMember(MemberDef *def, bool docOnly=FALSE) override
Definition groupdef.cpp:364
const DirList & getDirs() const override
Definition groupdef.cpp:119
void addMemberListToGroup(MemberList *, bool(MemberDef::*)() const)
const PageLinkedRefMap & getExamples() const override
Definition groupdef.cpp:120
void addFile(FileDef *def) override
Definition groupdef.cpp:262
bool hasDetailedDescription() const override
void overrideGroupGraph(bool e) override
const FileList & getFiles() const override
Definition groupdef.cpp:112
void writePageDocumentation(OutputList &ol)
const NamespaceLinkedRefMap & getNamespaces() const override
Definition groupdef.cpp:116
const PageLinkedRefMap & getPages() const override
Definition groupdef.cpp:118
void writeMemberGroups(OutputList &ol)
Definition * m_groupScope
Definition groupdef.cpp:170
ClassLinkedRefMap m_classes
Definition groupdef.cpp:160
void writeMemberPages(OutputList &ol, int hierarchyLevel) override
const MemberLists & getMemberLists() const override
Definition groupdef.cpp:107
QCString getOutputFileBase() const override
const ClassLinkedRefMap & getClasses() const override
Definition groupdef.cpp:113
void writePageNavigation(OutputList &ol) const override
bool m_hasGroupGraph
Definition groupdef.cpp:174
MemberNameInfoLinkedMap m_allMemberNameInfoLinkedMap
Definition groupdef.cpp:169
void writeFiles(OutputList &ol, const QCString &title)
Definition groupdef.cpp:932
void writeMemberDocumentation(OutputList &ol, MemberListType lt, const QCString &title)
void writeConcepts(OutputList &ol, const QCString &title)
bool addConcept(ConceptDef *def) override
Definition groupdef.cpp:294
DefType definitionType() const override
Definition groupdef.cpp:60
void writeNestedGroups(OutputList &ol, const QCString &title)
Definition groupdef.cpp:976
void writeDetailedDescription(OutputList &ol, const QCString &title)
Definition groupdef.cpp:787
void distributeMemberGroupDocumentation() override
Definition groupdef.cpp:234
void computeAnchors() override
Definition groupdef.cpp:647
void writeQuickMemberLinks(OutputList &ol, const MemberDef *currentMd) const override
void addRequirementReferences() override
void addListReferences() override
QCString m_title
Definition groupdef.cpp:155
bool containsFile(const FileDef *def) const override
Definition groupdef.cpp:276
PageLinkedRefMap m_pages
Definition groupdef.cpp:165
void countMembers() override
Definition groupdef.cpp:621
QCString m_titleAsText
Definition groupdef.cpp:156
bool isLinkableInProject() const override
MemberLists m_memberLists
Definition groupdef.cpp:171
size_t numDocMembers() const override
Definition groupdef.cpp:635
void addMemberToList(MemberListType lt, MemberDef *md)
const ConceptLinkedRefMap & getConcepts() const override
Definition groupdef.cpp:114
void writeDocumentation(OutputList &ol) override
void setGroupTitle(const QCString &newtitle) override
Definition groupdef.cpp:228
void writeBriefDescription(OutputList &ol)
Definition groupdef.cpp:865
void addExample(PageDef *def) override
Definition groupdef.cpp:345
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 QCString typeString() const =0
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 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 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
static RequirementManager & instance()
void addRequirementRefsForSymbol(const Definition *symbol)
class that provide information about a section.
Definition section.h:58
QCString label() const
Definition section.h:69
QCString title() const
Definition section.h:70
static SectionManager & instance()
returns a reference to the singleton
Definition section.h:179
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:1232
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:1960
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:178
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
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
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
Definition util.cpp:1998
QCString convertToHtml(const QCString &s, bool keepEntities)
Definition util.cpp:3944
QCString parseCommentAsText(const Definition *scope, const MemberDef *md, const QCString &doc, const QCString &fileName, int lineNr)
Definition util.cpp:5349
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:4805
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:4892
void createSubDirs(const Dir &d)
Definition util.cpp:3621
QCString convertToXML(const QCString &s, bool keepEntities)
Definition util.cpp:3893
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:4902
A bunch of utility functions.