Doxygen
docgroup.cpp
浏览该文件的文档.
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 #include <atomic>
17 #include "doxygen.h"
18 #include "util.h"
19 #include "entry.h"
20 #include "message.h"
21 #include "docgroup.h"
22 
23 static std::atomic_int g_groupId;
24 
25 void DocGroup::enterFile(const QCString &fileName,int)
26 {
27  m_openCount = 0;
28  m_autoGroupStack.clear();
32  m_compoundName=fileName;
33 }
34 
35 void DocGroup::leaveFile(const QCString &fileName,int line)
36 {
37  //if (m_memberGroupId!=DOX_NOGROUP)
38  //{
39  // warn(fileName,line,"end of file while inside a member group\n");
40  //}
44  if (!m_autoGroupStack.empty())
45  {
46  warn(fileName,line,"end of file while inside a group");
47  }
48  else if (m_openCount > 0) // < 0 is already handled on close call
49  {
50  warn(fileName,line,"end of file with unbalanced grouping commands");
51  }
52 }
53 
54 void DocGroup::enterCompound(const QCString &fileName,int line,const QCString &name)
55 {
57  {
58  warn(fileName,line,"try to put compound %s inside a member group\n",qPrint(name));
59  }
63  m_compoundName = name;
64  int i = m_compoundName.find('(');
65  if (i!=-1)
66  {
67  m_compoundName=m_compoundName.left(i); // strip category (Obj-C)
68  }
69  if (m_compoundName.isEmpty())
70  {
71  m_compoundName=fileName;
72  }
73  //printf("groupEnterCompound(%s)\n",name);
74 }
75 
76 void DocGroup::leaveCompound(const QCString &,int,const QCString & /*name*/)
77 {
78  //printf("groupLeaveCompound(%s)\n",name);
79  //if (m_memberGroupId!=DOX_NOGROUP)
80  //{
81  // warn(fileName,line,"end of compound %s while inside a member group\n",qPrint(name));
82  //}
87 }
88 
90 {
91  //printf("findExistingGroup %s:%s\n",qPrint(info->header),qPrint(info->compoundName));
92  for (const auto &kv : Doxygen::memberGroupInfoMap)
93  {
94  if (m_compoundName==kv.second->compoundName && // same file or scope
95  !kv.second->header.isEmpty() && // not a nameless group
96  qstricmp(kv.second->header,info->header)==0 // same header name
97  )
98  {
99  //printf("Found it!\n");
100  return kv.first; // put the item in this group
101  }
102  }
103  return ++g_groupId; // start new group
104 }
105 
106 void DocGroup::open(Entry *e,const QCString &,int, bool implicit)
107 {
108  if (!implicit) m_openCount++;
109  //printf("==> openGroup(name=%s,sec=%x) m_autoGroupStack=%d\n",
110  // qPrint(e->name),e->section,m_autoGroupStack.size());
111  if (e->section==Entry::GROUPDOC_SEC) // auto group
112  {
113  m_autoGroupStack.push_back(Grouping(e->name,e->groupingPri()));
114  }
115  else // start of a member group
116  {
117  //printf(" membergroup id=%d %s\n",m_memberGroupId,qPrint(m_memberGroupHeader));
118  if (m_memberGroupId==DOX_NOGROUP) // no group started yet
119  {
120  auto info = std::make_unique<MemberGroupInfo>();
121  info->header = m_memberGroupHeader.stripWhiteSpace();
122  info->compoundName = m_compoundName;
123  m_memberGroupId = findExistingGroup(info.get());
126  {
127  //printf(" use membergroup %d\n",m_memberGroupId);
128  Doxygen::memberGroupInfoMap.insert(std::make_pair(m_memberGroupId,std::move(info)));
129  }
131  e->mGrpId = m_memberGroupId;
132  }
133  }
134 }
135 
136 void DocGroup::close(Entry *e,const QCString &fileName,int line,bool foundInline,bool implicit)
137 {
138  if (!implicit)
139  {
140  if (m_openCount < 1)
141  {
142  warn(fileName,line,"unbalanced grouping commands");
143  }
144  else
145  {
146  m_openCount--;
147  }
148  }
149  //printf("==> closeGroup(name=%s,sec=%x,file=%s,line=%d) m_autoGroupStack=%d\n",
150  // qPrint(e->name),e->section,fileName,line,m_autoGroupStack.size());
151  if (m_memberGroupId!=DOX_NOGROUP) // end of member group
152  {
154  if (it!=Doxygen::memberGroupInfoMap.end()) // known group
155  {
156  auto &info = it->second;
157  info->doc = m_memberGroupDocs;
158  info->docFile = fileName;
159  info->docLine = line;
160  }
164  if (!foundInline) e->mGrpId=DOX_NOGROUP;
165  //printf("new group id=%d\n",m_memberGroupId);
166  }
167  else if (!m_autoGroupStack.empty()) // end of auto group
168  {
169  Grouping grp = m_autoGroupStack.back();
170  m_autoGroupStack.pop_back();
171  // see bug577005: we should not remove the last group for e
172  if (!foundInline && !e->groups.empty()) e->groups.pop_back();
173  //printf("Removing %s e=%p\n",qPrint(grp->groupname),e);
174  if (!foundInline) initGroupInfo(e);
175  }
176 }
177 
179 {
180  //printf("==> initGroup(id=%d,related=%s,e=%p)\n",m_memberGroupId,
181  // qPrint(m_memberGroupRelates),e);
182  e->mGrpId = m_memberGroupId;
184  if (!m_autoGroupStack.empty())
185  {
186  //printf("Appending group %s to %s: count=%d entry=%p\n",
187  // qPrint(m_autoGroupStack.top()->groupname),
188  // qPrint(e->name),e->groups->count(),e);
189  e->groups.push_back(Grouping(m_autoGroupStack.back()));
190  }
191 }
192 
194 {
196  {
199  if (!m_memberGroupDocs.isEmpty() && !e->doc.isEmpty())
200  {
201  m_memberGroupDocs+="\n\n";
202  }
206  {
207  auto &info = it->second;
208  info->doc = m_memberGroupDocs;
209  info->docFile = e->docFile;
210  info->docLine = e->docLine;
211  info->setRefItems(e->sli);
212  }
213  e->doc.resize(0);
214  e->brief.resize(0);
215  }
216 }
217 
218 bool DocGroup::isEmpty() const
219 {
220  return (m_memberGroupId==DOX_NOGROUP);
221 }
222 
224 {
226 }
227 
228 void DocGroup::appendHeader(const char text)
229 {
230  m_memberGroupHeader += text;
231 }
DocGroup::m_memberGroupRelates
QCString m_memberGroupRelates
Definition: docgroup.h:47
DocGroup::isEmpty
bool isEmpty() const
Definition: docgroup.cpp:218
Entry::groupingPri
Grouping::GroupPri_t groupingPri() const
Definition: entry.h:314
DocGroup::enterFile
void enterFile(const QCString &fileName, int)
Definition: docgroup.cpp:25
docgroup.h
QCString::isEmpty
bool isEmpty() const
Returns TRUE iff the string is empty
Definition: qcstring.h:144
Entry::name
QCString name
member name
Definition: entry.h:240
Grouping
Grouping info
Definition: types.h:64
Entry::mGrpId
int mGrpId
member group id
Definition: entry.h:286
DocGroup::m_compoundName
QCString m_compoundName
Definition: docgroup.h:50
DocGroup::leaveCompound
void leaveCompound(const QCString &, int, const QCString &)
Definition: docgroup.cpp:76
Entry::docLine
int docLine
line number at which the documentation was found
Definition: entry.h:268
QCString::find
int find(char c, int index=0, bool cs=TRUE) const
Definition: qcstring.cpp:38
DocGroup::clearHeader
void clearHeader()
Definition: docgroup.cpp:223
DocGroup::m_memberGroupDocs
QCString m_memberGroupDocs
Definition: docgroup.h:48
warn
void warn(const QCString &file, int line, const char *fmt,...)
Definition: message.cpp:151
Entry::relates
QCString relates
related class (doc block)
Definition: entry.h:276
Entry::doc
QCString doc
documentation block (partly parsed)
Definition: entry.h:267
end
DirIterator end(const DirIterator &) noexcept
Definition: dir.cpp:128
entry.h
DocGroup::m_memberGroupHeader
QCString m_memberGroupHeader
Definition: docgroup.h:45
QCString::stripWhiteSpace
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition: qcstring.h:243
QCString::left
QCString left(size_t len) const
Definition: qcstring.h:212
message.h
g_groupId
static std::atomic_int g_groupId
Definition: docgroup.cpp:23
DocGroup::open
void open(Entry *e, const QCString &, int, bool implicit=false)
Definition: docgroup.cpp:106
Entry::section
int section
entry type (see Sections);
Definition: entry.h:238
DocGroup::appendHeader
void appendHeader(const char)
Definition: docgroup.cpp:228
qstricmp
int qstricmp(const char *str1, const char *str2)
Definition: qcstring.cpp:433
doxygen.h
Doxygen::memberGroupInfoMap
static MemberGroupInfoMap memberGroupInfoMap
Definition: doxygen.h:100
DocGroup::initGroupInfo
void initGroupInfo(Entry *e)
Definition: docgroup.cpp:178
Entry::GROUPDOC_SEC
@ GROUPDOC_SEC
Definition: entry.h:107
MemberGroupInfo
Data collected for a member group
Definition: membergroup.h:114
MemberGroupInfo::header
QCString header
Definition: membergroup.h:117
Entry::brief
QCString brief
brief description (doc block)
Definition: entry.h:270
DocGroup::leaveFile
void leaveFile(const QCString &fileName, int line)
Definition: docgroup.cpp:35
DocGroup::addDocs
void addDocs(Entry *e)
Definition: docgroup.cpp:193
Entry
Represents an unstructured piece of information, about an entity found in the sources.
Definition: entry.h:61
DocGroup::enterCompound
void enterCompound(const QCString &fileName, int line, const QCString &name)
Definition: docgroup.cpp:54
qPrint
const char * qPrint(const char *s)
Definition: qcstring.h:589
stripLeadingAndTrailingEmptyLines
QCString stripLeadingAndTrailingEmptyLines(const QCString &s, int &docLine)
Special version of QCString::stripWhiteSpace() that only strips completely blank lines.
Definition: util.cpp:5394
DOX_NOGROUP
#define DOX_NOGROUP
Definition: membergroup.h:26
DocGroup::m_memberGroupId
int m_memberGroupId
Definition: docgroup.h:46
Entry::sli
RefItemVector sli
special lists (test/todo/bug/deprecated/..) this entry is in
Definition: entry.h:293
DocGroup::m_openCount
int m_openCount
Definition: docgroup.h:44
DocGroup::findExistingGroup
int findExistingGroup(const MemberGroupInfo *info)
Definition: docgroup.cpp:89
DocGroup::close
void close(Entry *e, const QCString &fileName, int line, bool foundInline, bool implicit=false)
Definition: docgroup.cpp:136
util.h
A bunch of utility functions.
Entry::docFile
QCString docFile
file in which the documentation was found
Definition: entry.h:269
Entry::groups
std::vector< Grouping > groups
list of groups this entry belongs to
Definition: entry.h:288
DocGroup::m_autoGroupStack
std::vector< Grouping > m_autoGroupStack
Definition: docgroup.h:49
Entry::MEMBERGRP_SEC
@ MEMBERGRP_SEC
Definition: entry.h:110
QCString::resize
bool resize(size_t newlen)
Resizes the string to hold newlen characters (this value should also count the 0-terminator).
Definition: qcstring.h:164
QCString
This is an alternative implementation of QCString.
Definition: qcstring.h:108