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#include "md5.h"
31
33 const QCString &d,const QCString &docFile,int docLine,
36 memberList(std::make_unique<MemberList>(MemberListType::MemberGroup(),con)),
38{
39 //printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
40 memberList->setNeedsSorting(Config_getBool(SORT_BRIEF_DOCS)); // detailed sections are already sorted elsewhere.
41 //printf("Member group docs='%s'\n",qPrint(doc));
42}
43
45{
46 //printf("MemberGroup::insertMember(%s) inSameSection=%d md->getSectionList()=%s\n",qPrint(md->name()),
47 // inSameSection,qPrint(md->getSectionList(m_container)->listType().to_string()));
48
49 MemberDef *firstMd = memberList->empty() ? nullptr : memberList->front();
50 if (inSameSection && firstMd &&
52 {
53 //printf("inSameSection=FALSE\n");
55 }
56 else if (inDeclSection==nullptr)
57 {
59 //printf("inDeclSection=%p type=%d\n",inDeclSection,inDeclSection->listType());
60 }
61 memberList->push_back(md);
62
63 // copy the group of the first member in the memberGroup
64 GroupDef *gd = nullptr;
65 if (firstMd && !firstMd->isAlias() && (gd=firstMd->getGroupDef()))
66 {
68 if (mdm)
69 {
70 mdm->setGroupDef(gd, firstMd->getGroupPri(),
71 firstMd->getGroupFileName(),
72 firstMd->getGroupStartLine(),
73 firstMd->getGroupHasDocs());
74 }
75 gd->insertMember(md);
76 }
77}
78
79
81{
82 memberList->setAnchors();
83}
84
86{
87 memberList->setAnonymousMemberPrefix(prefix);
88}
89
91 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
92 bool showInline) const
93{
94 //printf("MemberGroup::writeDeclarations() %s\n",qPrint(grpHeader));
95 QCString ldoc = doc;
96 memberList->writeDeclarations(ol,cd,nd,fd,gd,mod,grpHeader,ldoc,FALSE,showInline);
97}
98
100 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
101 int indentLevel,const ClassDef *inheritedFrom,const QCString &inheritId
102 ) const
103{
104 //printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
105 memberList->writePlainDeclarations(ol,inGroup,cd,nd,fd,gd,mod,indentLevel,inheritedFrom,inheritId);
106}
107
109 const Definition *container,bool showEnumValues,bool showInline) const
110{
111 //printf("MemberGroup::writeDocumentation() %s\n",qPrint(grpHeader));
112 memberList->writeDocumentation(ol,scopeName,container,QCString(),memberList->listType().toLabel(),showEnumValues,showInline);
113}
114
116 const DefinitionMutable *container) const
117{
118 memberList->writeDocumentationPage(ol,scopeName,container);
119}
120
122{
123 memberList->setAnonymousEnumType();
124}
125
128 const ClassDef *inheritedFrom,const QCString &inheritId) const
129{
130 //printf("** addGroupedInheritedMembers()\n");
131 for (const auto &md : *memberList)
132 {
133 //printf("matching %d == %d\n",lt,md->getSectionList()->listType());
134 const MemberList *ml = md->getSectionList(m_container);
135 if (ml && lt==ml->listType())
136 {
138 mml.push_back(md);
139 mml.countDecMembers();
140 mml.writePlainDeclarations(ol,false,cd,nullptr,nullptr,nullptr,nullptr,0,inheritedFrom,inheritId);
141 }
142 }
143}
144
146{
147 //printf("** countGroupedInheritedMembers()\n");
148 int count=0;
149 for (const auto &md : *memberList)
150 {
151 //printf("matching %d == %d\n",lt,md->getSectionList()->listType());
152 const MemberList *ml = md->getSectionList(m_container);
153 if (ml && lt==ml->listType())
154 {
155 count++;
156 }
157 }
158 return count;
159}
160
161
162/*! Add this group as a subsection of the declaration section, instead
163 * of rendering it in its own section
164 */
166{
167 if (inDeclSection)
168 {
169 //printf("Adding group %p to list %p (type=%d) memberList=%p\n",this,
170 // inDeclSection,inDeclSection->listType(),memberList);
171 inDeclSection->addMemberGroup(this);
172 }
173}
174
176{
177 memberList->countDecMembers();
178}
179
181{
182 memberList->countDocMembers();
183}
184
186{
187 return m_container;
188}
189
191{
192 // return the container for the first member.
193 // Note this can be different from container() in case
194 // the member is rendered as part of a file but the members
195 // are actually of a namespace.
196 const Definition *ctx = nullptr;
197 if (memberList && !memberList->empty())
198 {
199 const MemberDef *md = memberList->front();
200 ctx = md->getClassDef();
201 if (ctx==nullptr) ctx = md->getNamespaceDef();
202 if (ctx==nullptr) ctx = md->getFileDef();
203 }
204 return ctx==nullptr ? m_container : ctx;
205}
206
207int MemberGroup::countInheritableMembers(const ClassDef *inheritedFrom) const
208{
209 return memberList->countInheritableMembers(inheritedFrom);
210}
211
212
214{
215 //printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",qPrint(grpHeader));
216 const MemberDef *md = nullptr;
217 for (const auto &smd : *memberList)
218 {
219 //printf("checking md=%s\n",qPrint(md->name()));
220 // find the first member of the group with documentation
221 if (!smd->documentation().isEmpty() ||
222 !smd->briefDescription().isEmpty() ||
223 !smd->inbodyDocumentation().isEmpty()
224 )
225 {
226 //printf("found it!\n");
227 md = smd;
228 break;
229 }
230 }
231 if (md) // distribute docs of md to other members of the list
232 {
233 //printf("Member %s has documentation!\n",qPrint(md->name()));
234 for (const auto &iomd : *memberList)
235 {
237 if (omd && md!=omd && omd->documentation().isEmpty() &&
238 omd->briefDescription().isEmpty() &&
240 )
241 {
242 //printf("Copying documentation to member %s\n",qPrint(omd->name()));
244 omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
246 }
247 }
248 }
249}
250
251
253{
254 return memberList->numDecMembers();
255}
256
258{
259 return memberList->numDecEnumValues();
260}
261
263{
264 return memberList->numDocMembers();
265}
266
268{
269 return memberList->numDocEnumValues();
270}
271
273{
274 memberList->addListReferences(def);
275}
276
278{
279 memberList->addRequirementReferences(def);
280}
281
283{
285 memberList->findSectionsInDocumentation(d);
286}
287
289{
290 m_xrefListItems.insert(m_xrefListItems.end(), sli.cbegin(), sli.cend());
291}
292
294{
295 m_requirementRefs.insert(m_requirementRefs.end(), rqli.cbegin(), rqli.cend());
296}
297
298void MemberGroup::writeTagFile(TextStream &tagFile,bool qualifiedName)
299{
300 memberList->writeTagFile(tagFile,qualifiedName);
301}
302
303//--------------------------------------------------------------------------
304
306{
307 m_sli.insert(m_sli.end(), sli.cbegin(), sli.cend());
308}
309
311{
312 m_rqli.insert(m_rqli.end(), rqli.cbegin(), rqli.cend());
313}
314
315
constexpr auto prefix
Definition anchor.cpp:44
A abstract class representing of a compound symbol.
Definition classdef.h:104
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual QCString docFile() const =0
virtual int docLine() const =0
virtual int inbodyLine() const =0
virtual int briefLine() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual QCString documentation() const =0
virtual bool isAlias() const =0
virtual QCString briefFile() const =0
virtual QCString inbodyDocumentation() const =0
virtual QCString inbodyFile() const =0
virtual void setDocumentation(const QCString &d, const QCString &docFile, int docLine, bool stripWhiteSpace=TRUE)=0
virtual void setInbodyDocumentation(const QCString &d, const QCString &docFile, int docLine)=0
virtual void setBriefDescription(const QCString &b, const QCString &briefFile, int briefLine)=0
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 const MemberList * getSectionList(const Definition *container) const =0
virtual QCString getGroupFileName() const =0
virtual void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr)=0
bool inSameSection
MemberGroup(const Definition *container, int id, const QCString &header, const QCString &docs, const QCString &docFile, int docLine, MemberListContainer con)
void addToDeclarationSection()
int numDecMembers() const
const Definition * container() const
int numDecEnumValues() const
void findSectionsInDocumentation(const Definition *d)
void addGroupedInheritedMembers(OutputList &ol, const ClassDef *cd, MemberListType lt, const ClassDef *inheritedFrom, const QCString &inheritId) const
void setAnchors()
void writeDeclarations(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool showInline=FALSE) const
int countInheritableMembers(const ClassDef *inheritedFrom) const
const Definition * memberContainer() const
void writeDocumentation(OutputList &ol, const QCString &scopeName, const Definition *container, bool showEnumValues, bool showInline) const
void writeDocumentationPage(OutputList &ol, const QCString &scopeName, const DefinitionMutable *container) const
int numDocMembers() const
void addRequirementReferences(const Definition *def)
void addListReferences(const Definition *def)
void setRefItems(const RefItemVector &sli)
void setAnonymousMemberPrefix(const QCString &prefix)
void distributeMemberGroupDocumentation()
void countDecMembers()
void writeTagFile(TextStream &, bool qualifiedName=false)
int countGroupedInheritedMembers(MemberListType lt)
void countDocMembers()
int numDocEnumValues() 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 QCString &inheritId) const
QCString docFile() const
Definition membergroup.h:92
int docLine() const
Definition membergroup.h:93
QCString doc
void insertMember(MemberDef *md)
RequirementRefs m_requirementRefs
QCString m_docFile
void setAnonymousEnumType()
const Definition * m_container
Definition membergroup.h:96
RefItemVector m_xrefListItems
std::unique_ptr< MemberList > memberList
Definition membergroup.h:97
MemberList * inDeclSection
Definition membergroup.h:98
void setRequirementReferences(const RequirementRefs &rqli)
QCString grpHeader
A list of MemberDef objects as shown in documentation sections.
Definition memberlist.h:125
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 QCString &inheritId) const
MemberListType listType() const
Definition memberlist.h:130
void countDecMembers() const
Wrapper class for the MemberListType type.
Definition types.h:346
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
This is an alternative implementation of QCString.
Definition qcstring.h:103
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:167
Text streaming class that buffers data.
Definition textstream.h:36
#define Config_getBool(name)
Definition config.h:33
void docFindSections(const QCString &input, const Definition *d, const QCString &fileName)
MemberDefMutable * toMemberDefMutable(Definition *d)
#define FALSE
Definition qcstring.h:34
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.