Doxygen
Loading...
Searching...
No Matches
membergroup.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 "membergroup.h"
19#include "memberlist.h"
20#include "outputlist.h"
21#include "util.h"
22#include "classdef.h"
23#include "namespacedef.h"
24#include "filedef.h"
25#include "language.h"
26#include "groupdef.h"
27#include "doxygen.h"
28#include "docparser.h"
29#include "entry.h"
30
32 const DString &d,const DString &docFile,int docLine,
35 memberList(std::make_unique<MemberList>(MemberListType::MemberGroup(),con)),
37{
38 //printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
39 memberList->setNeedsSorting(Config_getBool(SORT_BRIEF_DOCS)); // detailed sections are already sorted elsewhere.
40 //printf("Member group docs='%s'\n",qPrint(doc));
41}
42
44{
45 //printf("MemberGroup::insertMember(%s) inSameSection=%d md->getSectionList()=%s\n",qPrint(md->name()),
46 // inSameSection,qPrint(md->getSectionList(m_container)->listType().to_string()));
47
48 MemberDef *firstMd = memberList->empty() ? nullptr : memberList->front();
49 if (inSameSection && firstMd &&
51 {
52 //printf("inSameSection=false\n");
53 inSameSection=false;
54 }
55 else if (inDeclSection==nullptr)
56 {
58 //printf("inDeclSection=%p type=%d\n",inDeclSection,inDeclSection->listType());
59 }
60 memberList->push_back(md);
61
62 // copy the group of the first member in the memberGroup
63 GroupDef *gd = nullptr;
64 if (firstMd && !firstMd->isAlias() && (gd=firstMd->getGroupDef()))
65 {
67 if (mdm)
68 {
69 mdm->setGroupDef(gd, firstMd->getGroupPri(),
70 firstMd->getGroupFileName(),
71 firstMd->getGroupStartLine(),
72 firstMd->getGroupHasDocs());
73 }
74 gd->insertMember(md);
75 }
76}
77
78
80{
81 memberList->setAnchors();
82}
83
85 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
86 bool showInline) const
87{
88 //printf("MemberGroup::writeDeclarations() %s\n",qPrint(grpHeader));
89 DString ldoc = doc;
90 memberList->writeDeclarations(ol,cd,nd,fd,gd,mod,grpHeader,ldoc,false,showInline);
91}
92
94 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
95 int indentLevel,const ClassDef *inheritedFrom,const DString &inheritId
96 ) const
97{
98 //printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
99 memberList->writePlainDeclarations(ol,inGroup,cd,nd,fd,gd,mod,indentLevel,inheritedFrom,inheritId);
100}
101
103 const Definition *container,bool showEnumValues,bool showInline) const
104{
105 //printf("MemberGroup::writeDocumentation() %s\n",qPrint(grpHeader));
106 memberList->writeDocumentation(ol,scopeName,container,DString(),memberList->listType().toLabel(),showEnumValues,showInline);
107}
108
110 const DefinitionMutable *container) const
111{
112 memberList->writeDocumentationPage(ol,scopeName,container);
113}
114
116{
117 memberList->setAnonymousEnumType();
118}
119
122 const ClassDef *inheritedFrom,const DString &inheritId) const
123{
124 //printf("** addGroupedInheritedMembers()\n");
125 for (const auto &md : *memberList)
126 {
127 //printf("matching %d == %d\n",lt,md->getSectionList()->listType());
128 const MemberList *ml = md->getSectionList(m_container);
129 if (ml && lt==ml->listType())
130 {
132 mml.push_back(md);
133 mml.countDecMembers();
134 mml.writePlainDeclarations(ol,false,cd,nullptr,nullptr,nullptr,nullptr,0,inheritedFrom,inheritId);
135 }
136 }
137}
138
140{
141 //printf("** countGroupedInheritedMembers()\n");
142 int count=0;
143 for (const auto &md : *memberList)
144 {
145 //printf("matching %d == %d\n",lt,md->getSectionList()->listType());
146 const MemberList *ml = md->getSectionList(m_container);
147 if (ml && lt==ml->listType())
148 {
149 count++;
150 }
151 }
152 return count;
153}
154
155
156/*! Add this group as a subsection of the declaration section, instead
157 * of rendering it in its own section
158 */
160{
161 if (inDeclSection)
162 {
163 //printf("Adding group %p to list %p (type=%d) memberList=%p\n",this,
164 // inDeclSection,inDeclSection->listType(),memberList);
166 }
167}
168
170{
171 memberList->countDecMembers();
172}
173
175{
176 memberList->countDocMembers();
177}
178
180{
181 return m_container;
182}
183
185{
186 // return the container for the first member.
187 // Note this can be different from container() in case
188 // the member is rendered as part of a file but the members
189 // are actually of a namespace.
190 const Definition *ctx = nullptr;
191 if (memberList && !memberList->empty())
192 {
193 const MemberDef *md = memberList->front();
194 ctx = md->getClassDef();
195 if (ctx==nullptr) ctx = md->getNamespaceDef();
196 if (ctx==nullptr) ctx = md->getFileDef();
197 }
198 return ctx==nullptr ? m_container : ctx;
199}
200
201int MemberGroup::countInheritableMembers(const ClassDef *inheritedFrom) const
202{
203 return memberList->countInheritableMembers(inheritedFrom);
204}
205
206
208{
209 //printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",qPrint(grpHeader));
210 const MemberDef *md = nullptr;
211 for (const auto &smd : *memberList)
212 {
213 //printf("checking md=%s\n",qPrint(md->name()));
214 // find the first member of the group with documentation
215 if (!smd->documentation().empty() ||
216 !smd->briefDescription().empty() ||
217 !smd->inbodyDocumentation().empty()
218 )
219 {
220 //printf("found it!\n");
221 md = smd;
222 break;
223 }
224 }
225 if (md) // distribute docs of md to other members of the list
226 {
227 //printf("Member %s has documentation!\n",qPrint(md->name()));
228 for (const auto &iomd : *memberList)
229 {
231 if (omd && md!=omd && omd->documentation().empty() &&
232 omd->briefDescription().empty() &&
234 )
235 {
236 //printf("Copying documentation to member %s\n",qPrint(omd->name()));
238 omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
240 }
241 }
242 }
243}
244
245
247{
248 return memberList->numDecMembers();
249}
250
252{
253 return memberList->numDecEnumValues();
254}
255
257{
258 return memberList->numDocMembers();
259}
260
262{
263 return memberList->numDocEnumValues();
264}
265
267{
268 memberList->addListReferences(def);
269}
270
272{
273 memberList->addRequirementReferences(def);
274}
275
277{
279 memberList->findSectionsInDocumentation(d);
280}
281
283{
284 m_xrefListItems.insert(m_xrefListItems.end(), sli.cbegin(), sli.cend());
285}
286
288{
289 m_requirementRefs.insert(m_requirementRefs.end(), rqli.cbegin(), rqli.cend());
290}
291
292void MemberGroup::writeTagFile(TextStream &tagFile,bool qualifiedName)
293{
294 memberList->writeTagFile(tagFile,qualifiedName);
295}
296
297//--------------------------------------------------------------------------
298
300{
301 m_sli.insert(m_sli.end(), sli.cbegin(), sli.cend());
302}
303
305{
306 m_rqli.insert(m_rqli.end(), rqli.cbegin(), rqli.cend());
307}
308
309//--------------------------------------------------------------------------
310
312 MemberGroupList *pMemberGroups,
313 const Definition *context)
314{
315 ASSERT(context!=nullptr);
316 //printf("addMemberToMemberGroup() context=%s\n",qPrint(context->name()));
317 if (ml==nullptr) return;
318
319 struct MoveMemberInfo
320 {
321 MoveMemberInfo(MemberDef *md,MemberGroup *mg,const RefItemVector &rv)
322 : memberDef(md), memberGroup(mg), sli(rv) {}
323 MemberDef *memberDef;
324 MemberGroup *memberGroup;
325 RefItemVector sli;
326 };
327 std::vector<MoveMemberInfo> movedMembers;
328
329 for (const auto &md : *ml)
330 {
331 if (md->isEnumerate()) // insert enum value of this enum into groups
332 {
333 for (const auto &fmd : md->enumFieldList())
334 {
335 int groupId=fmd->getMemberGroupId();
336 if (groupId!=-1)
337 {
338 auto it = Doxygen::memberGroupInfoMap.find(groupId);
340 {
341 const auto &info = it->second;
342 auto mg_it = std::find_if(pMemberGroups->begin(),
343 pMemberGroups->end(),
344 [&groupId](const auto &g)
345 { return g->groupId()==groupId; }
346 );
347 MemberGroup *mg_ptr = nullptr;
348 if (mg_it==pMemberGroups->end())
349 {
350 auto mg = std::make_unique<MemberGroup>(
351 context,
352 groupId,
353 info->header,
354 info->doc,
355 info->docFile,
356 info->docLine,
357 ml->container());
358 mg_ptr = mg.get();
359 pMemberGroups->push_back(std::move(mg));
360 }
361 else
362 {
363 mg_ptr = (*mg_it).get();
364 }
365 mg_ptr->insertMember(fmd); // insert in member group
367 if (fmdm)
368 {
369 fmdm->setMemberGroup(mg_ptr);
370 }
371 }
372 }
373 }
374 }
375 int groupId=md->getMemberGroupId();
376 if (groupId!=-1)
377 {
378 auto it = Doxygen::memberGroupInfoMap.find(groupId);
380 {
381 const auto &info = it->second;
382 auto mg_it = std::find_if(pMemberGroups->begin(),
383 pMemberGroups->end(),
384 [&groupId](const auto &g)
385 { return g->groupId()==groupId; }
386 );
387 MemberGroup *mg_ptr = nullptr;
388 if (mg_it==pMemberGroups->end())
389 {
390 auto mg = std::make_unique<MemberGroup>(
391 context,
392 groupId,
393 info->header,
394 info->doc,
395 info->docFile,
396 info->docLine,
397 ml->container());
398 mg_ptr = mg.get();
399 pMemberGroups->push_back(std::move(mg));
400 }
401 else
402 {
403 mg_ptr = (*mg_it).get();
404 }
405 movedMembers.emplace_back(md,mg_ptr,info->m_sli);
406 }
407 }
408 }
409
410 // move the members to their group
411 for (const auto &mmi : movedMembers)
412 {
413 ml->remove(mmi.memberDef); // remove from member list
414 mmi.memberGroup->insertMember(mmi.memberDef->resolveAlias()); // insert in member group
415 mmi.memberGroup->setRefItems(mmi.sli);
416 MemberDefMutable *rmdm = toMemberDefMutable(mmi.memberDef);
417 if (rmdm)
418 {
419 rmdm->setMemberGroup(mmi.memberGroup);
420 }
421 }
422}
423
A abstract class representing of a compound symbol.
Definition classdef.h:104
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:89
DString()=default
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:153
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual DString briefDescription(bool abbreviate=false) const =0
virtual DString inbodyFile() const =0
virtual DString briefFile() const =0
virtual int docLine() const =0
virtual DString documentation() const =0
virtual DString inbodyDocumentation() const =0
virtual int inbodyLine() const =0
virtual int briefLine() const =0
virtual bool isAlias() const =0
virtual DString docFile() const =0
virtual void setInbodyDocumentation(const DString &d, const DString &docFile, int docLine)=0
virtual void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true)=0
virtual void setBriefDescription(const DString &b, const DString &briefFile, int briefLine)=0
static MemberGroupInfoMap memberGroupInfoMap
Definition doxygen.h:118
A model of a file symbol.
Definition filedef.h:99
A model of a group of symbols.
Definition groupdef.h:52
virtual bool insertMember(MemberDef *def, bool docOnly=false)=0
A model of a class/file/namespace member symbol.
Definition memberdef.h:48
virtual bool getGroupHasDocs() const =0
virtual const ClassDef * getClassDef() const =0
virtual GroupDef * getGroupDef()=0
virtual const FileDef * getFileDef() const =0
virtual int getGroupStartLine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual Grouping::GroupPri_t getGroupPri() const =0
virtual void setMemberGroup(MemberGroup *grp)=0
virtual const MemberList * getSectionList(const Definition *container) const =0
virtual DString getGroupFileName() const =0
virtual void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const DString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr)=0
A class representing a group of members.
Definition membergroup.h:44
bool inSameSection
void addGroupedInheritedMembers(OutputList &ol, const ClassDef *cd, MemberListType lt, const ClassDef *inheritedFrom, const DString &inheritId) const
void addToDeclarationSection()
int numDecMembers() const
const Definition * container() const
int numDecEnumValues() const
void findSectionsInDocumentation(const Definition *d)
void setAnchors()
void writeDocumentationPage(OutputList &ol, const DString &scopeName, const DefinitionMutable *container) const
int countInheritableMembers(const ClassDef *inheritedFrom) const
const Definition * memberContainer() const
int numDocMembers() const
void addRequirementReferences(const Definition *def)
void addListReferences(const Definition *def)
void setRefItems(const RefItemVector &sli)
void distributeMemberGroupDocumentation()
MemberGroup(const Definition *container, int id, const DString &header, const DString &docs, const DString &docFile, int docLine, MemberListContainer con)
void writeDeclarations(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool showInline=false) const
void countDecMembers()
void writePlainDeclarations(OutputList &ol, bool inGroup, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, int indentLevel, const ClassDef *inheritedFrom, const DString &inheritId) const
void writeTagFile(TextStream &, bool qualifiedName=false)
int countGroupedInheritedMembers(MemberListType lt)
void countDocMembers()
int numDocEnumValues() const
void writeDocumentation(OutputList &ol, const DString &scopeName, const Definition *container, bool showEnumValues, bool showInline) const
DString doc
int docLine() const
Definition membergroup.h:92
DString m_docFile
void insertMember(MemberDef *md)
RequirementRefs m_requirementRefs
void setAnonymousEnumType()
DString grpHeader
Definition membergroup.h:99
const Definition * m_container
Definition membergroup.h:95
RefItemVector m_xrefListItems
std::unique_ptr< MemberList > memberList
Definition membergroup.h:96
DString docFile() const
Definition membergroup.h:91
MemberList * inDeclSection
Definition membergroup.h:97
void setRequirementReferences(const RequirementRefs &rqli)
A list of MemberDef objects as shown in documentation sections.
Definition memberlist.h:125
MemberListContainer container() const
Definition memberlist.h:131
MemberListType listType() const
Definition memberlist.h:130
void countDecMembers() const
void writePlainDeclarations(OutputList &ol, bool inGroup, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, int indentLevel, const ClassDef *inheritedFrom, const DString &inheritId) const
void addMemberGroup(MemberGroup *mg)
Wrapper class for the MemberListType type.
Definition types.h:346
void remove(const MemberDef *md)
Definition memberlist.h:84
void push_back(const T &value)
Definition memberlist.h:48
An abstract interface of a namespace symbol.
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:315
Text streaming class that buffers data.
Definition textstream.h:36
#define Config_getBool(name)
Definition config.h:33
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175
void docFindSections(const DString &input, const Definition *d, const DString &fileName)
static void addMembersToMemberGroup()
Definition doxygen.cpp:9373
#define ASSERT(x)
Definition dstring.h:29
MemberDefMutable * toMemberDefMutable(Definition *d)
Definition dstring.h:918
std::vector< RefItem * > RefItemVector
Definition reflist.h:133
std::vector< RequirementRef > RequirementRefs
List of requirement references.
Definition requirement.h:56
RefItemVector m_sli
RequirementRefs m_rqli
void setRequirementReferences(const RequirementRefs &rqli)
void setRefItems(const RefItemVector &sli)
MemberListContainer
Definition types.h:472
A bunch of utility functions.