Doxygen
Loading...
Searching...
No Matches
docgroup.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2019 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16// own header
17#include "docgroup.h"
18
19// standard includes
20#include <atomic>
21#include <mutex>
22
23// other includes
24#include "doxygen.h"
25#include "entry.h"
26#include "message.h"
27#include "util.h"
28
29static std::atomic_int g_groupId;
30static std::mutex g_memberGroupInfoMapMutex;
31
32void DocGroup::enterFile(const DString &fileName,int)
33{
34 m_openCount = 0;
35 m_autoGroupStack.clear();
39 m_compoundName=fileName;
40}
41
42void DocGroup::leaveFile(const DString &fileName,int line)
43{
44 //if (m_memberGroupId!=DOX_NOGROUP)
45 //{
46 // warn(fileName,line,"end of file while inside a member group");
47 //}
51 if (!m_autoGroupStack.empty())
52 {
53 warn(fileName,line,"end of file while inside a group");
54 }
55 else if (m_openCount > 0) // < 0 is already handled on close call
56 {
57 warn(fileName,line,"end of file with unbalanced grouping commands");
58 }
59}
60
61void DocGroup::enterCompound(const DString &fileName,int line,const DString &name)
62{
64 {
65 warn(fileName,line,"try to put compound {} inside a member group",name);
66 }
70 m_compoundName = name;
71 size_t i = m_compoundName.find('(');
72 if (i!=DString::npos)
73 {
74 m_compoundName=m_compoundName.left(i); // strip category (Obj-C)
75 }
77 {
78 m_compoundName=fileName;
79 }
80 //printf("groupEnterCompound(%s)\n",qPrint(name));
81}
82
83void DocGroup::leaveCompound(const DString &,int,const DString &/* name */)
84{
85 //printf("groupLeaveCompound(%s)\n",qPrint(name));
86 //if (m_memberGroupId!=DOX_NOGROUP)
87 //{
88 // warn(fileName,line,"end of compound {} while inside a member group\n",name);
89 //}
94}
95
97{
98 std::lock_guard<std::mutex> lock(g_memberGroupInfoMapMutex);
99 //printf("findExistingGroup %s:%s\n",qPrint(info->header),qPrint(info->compoundName));
100 for (const auto &[groupId,groupInfo] : Doxygen::memberGroupInfoMap)
101 {
102 if (m_compoundName==groupInfo->compoundName && // same file or scope
103 !groupInfo->header.empty() && // not a nameless group
104 dstricmp(groupInfo->header,info->header)==0 // same header name
105 )
106 {
107 //printf("Found it!\n");
108 return groupId; // put the item in this group
109 }
110 }
111 return ++g_groupId; // start new group
112}
113
114void DocGroup::open(Entry *e,const DString &,int, bool implicit)
115{
116 if (!implicit) m_openCount++;
117 //printf("==> openGroup(name=%s,sec=%x) m_autoGroupStack=%zu\n",
118 // qPrint(e->name),e->section,m_autoGroupStack.size());
119 if (e->section.isGroupDoc()) // auto group
120 {
121 m_autoGroupStack.emplace_back(e->name,e->groupingPri());
122 }
123 else // start of a member group
124 {
125 //printf(" membergroup id=%d %s\n",m_memberGroupId,qPrint(m_memberGroupHeader));
126 if (m_memberGroupId==DOX_NOGROUP) // no group started yet
127 {
128 auto info = std::make_unique<MemberGroupInfo>();
129 info->header = m_memberGroupHeader.stripWhiteSpace();
130 info->compoundName = m_compoundName;
132 {
133 std::lock_guard<std::mutex> lock(g_memberGroupInfoMapMutex);
136 {
137 //printf(" use membergroup %d\n",m_memberGroupId);
138 Doxygen::memberGroupInfoMap.emplace(m_memberGroupId,std::move(info));
139 }
140 }
143 }
144 }
145}
146
147void DocGroup::close(Entry *e,const DString &fileName,int line,bool foundInline,bool implicit)
148{
149 if (!implicit)
150 {
151 if (m_openCount < 1)
152 {
153 warn(fileName,line,"unbalanced grouping commands");
154 }
155 else
156 {
157 m_openCount--;
158 }
159 }
160 //printf("==> closeGroup(name=%s,sec=%x,file=%s,line=%d) m_autoGroupStack=%zu\n",
161 // qPrint(e->name),e->section,qPrint(fileName),line,m_autoGroupStack.size());
162 if (m_memberGroupId!=DOX_NOGROUP) // end of member group
163 {
164 {
165 std::lock_guard<std::mutex> lock(g_memberGroupInfoMapMutex);
167 if (it!=Doxygen::memberGroupInfoMap.end()) // known group
168 {
169 auto &info = it->second;
170 info->doc = m_memberGroupDocs;
171 //info->docFile = fileName;
172 //info->docLine = line;
173 }
174 }
178 if (!foundInline)
179 {
181 e->relates="";
182 }
183 //printf("new group id=%d\n",m_memberGroupId);
184 }
185 else if (!m_autoGroupStack.empty()) // end of auto group
186 {
187 Grouping grp = m_autoGroupStack.back();
188 m_autoGroupStack.pop_back();
189 // see bug577005: we should not remove the last group for e
190 if (!foundInline && !e->groups.empty()) e->groups.pop_back();
191 //printf("Removing %s e=%p\n",qPrint(grp->groupname),e);
192 if (!foundInline) initGroupInfo(e);
193 }
194}
195
197{
198 //printf("==> initGroup(id=%d,related=%s,e=%p,#stack=%zu)\n",m_memberGroupId,
199 // qPrint(m_memberGroupRelates),(void*)e,m_autoGroupStack.size());
202 if (!m_autoGroupStack.empty())
203 {
204 //printf("Appending group %s to %s: count=%zu entry=%p\n",
205 // qPrint(m_autoGroupStack.back().groupname),
206 // qPrint(e->name),e->groups.size(),(void*)e);
207 e->groups.emplace_back(m_autoGroupStack.back());
208 }
209}
210
212{
213 if (e->section.isMemberGrp())
214 {
217 if (!m_memberGroupDocs.empty() && !e->doc.empty())
218 {
219 m_memberGroupDocs+="\n\n";
220 }
222 {
223 std::lock_guard<std::mutex> lock(g_memberGroupInfoMapMutex);
226 {
227 auto &info = it->second;
228 info->doc = m_memberGroupDocs;
229 info->docFile = e->docFile;
230 info->docLine = e->docLine;
231 info->setRefItems(e->sli);
232 info->setRequirementReferences(e->rqli);
233 }
234 }
235 e->doc.clear();
236 e->brief.clear();
237 }
238}
239
240bool DocGroup::empty() const
241{
243}
244
249
250void DocGroup::appendHeader(const char text)
251{
252 m_memberGroupHeader += text;
253}
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
void clear()
Definition dstring.h:214
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:337
DString left(size_t len) const
Definition dstring.h:306
DString m_memberGroupHeader
Definition docgroup.h:45
int m_openCount
Definition docgroup.h:44
void enterFile(const DString &fileName, int)
Definition docgroup.cpp:32
void initGroupInfo(Entry *e)
Definition docgroup.cpp:196
int m_memberGroupId
Definition docgroup.h:46
int findExistingGroup(const MemberGroupInfo *info)
Definition docgroup.cpp:96
DString m_compoundName
Definition docgroup.h:50
void leaveFile(const DString &fileName, int line)
Definition docgroup.cpp:42
void open(Entry *e, const DString &, int, bool implicit=false)
Definition docgroup.cpp:114
DString m_memberGroupDocs
Definition docgroup.h:48
void addDocs(Entry *e)
Definition docgroup.cpp:211
void appendHeader(const char)
Definition docgroup.cpp:250
std::vector< Grouping > m_autoGroupStack
Definition docgroup.h:49
void close(Entry *e, const DString &fileName, int line, bool foundInline, bool implicit=false)
Definition docgroup.cpp:147
void clearHeader()
Definition docgroup.cpp:245
bool empty() const
Definition docgroup.cpp:240
DString m_memberGroupRelates
Definition docgroup.h:47
void leaveCompound(const DString &, int, const DString &)
Definition docgroup.cpp:83
void enterCompound(const DString &fileName, int line, const DString &name)
Definition docgroup.cpp:61
static MemberGroupInfoMap memberGroupInfoMap
Definition doxygen.h:111
Represents an unstructured piece of information, about an entity found in the sources.
Definition entry.h:115
RequirementRefs rqli
references to requirements
Definition entry.h:227
int docLine
line number at which the documentation was found
Definition entry.h:201
DString docFile
file in which the documentation was found
Definition entry.h:202
DString doc
documentation block (partly parsed)
Definition entry.h:200
DString brief
brief description (doc block)
Definition entry.h:203
std::vector< Grouping > groups
list of groups this entry belongs to
Definition entry.h:221
Grouping::GroupPri_t groupingPri() const
Definition entry.h:249
EntryType section
entry type (see Sections);
Definition entry.h:171
DString relates
related class (doc block)
Definition entry.h:209
int mGrpId
member group id
Definition entry.h:219
DString name
member name
Definition entry.h:173
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
Definition entry.h:226
Data collected for a member group.
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:181
static std::atomic_int g_groupId
Definition docgroup.cpp:29
static std::mutex g_memberGroupInfoMapMutex
Definition docgroup.cpp:30
int dstricmp(const char *s1, const char *s2)
Definition dstring.cpp:444
#define DOX_NOGROUP
Definition membergroup.h:26
#define warn(file, line, fmt,...)
Definition message.h:97
Grouping info.
Definition types.h:227
DString stripLeadingAndTrailingEmptyLines(const DString &s, int &docLine)
Special version of DString::stripWhiteSpace() that only strips completely blank lines.
Definition util.cpp:3987
A bunch of utility functions.