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