mirror of https://gitee.com/openkylin/doxygen.git
284 lines
8.4 KiB
C++
284 lines
8.4 KiB
C++
/******************************************************************************
|
|
*
|
|
*
|
|
*
|
|
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software and its
|
|
* documentation under the terms of the GNU General Public License is hereby
|
|
* granted. No representations are made about the suitability of this software
|
|
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
* See the GNU General Public License for more details.
|
|
*
|
|
* Documents produced by Doxygen are derivative works derived from the
|
|
* input used in their production; they are not affected by this license.
|
|
*
|
|
*/
|
|
|
|
#include "membergroup.h"
|
|
#include "memberlist.h"
|
|
#include "outputlist.h"
|
|
#include "util.h"
|
|
#include "classdef.h"
|
|
#include "namespacedef.h"
|
|
#include "filedef.h"
|
|
#include "language.h"
|
|
#include "groupdef.h"
|
|
#include "doxygen.h"
|
|
#include "docparser.h"
|
|
#include "entry.h"
|
|
#include "md5.h"
|
|
|
|
MemberGroup::MemberGroup(const Definition *container,int id,const QCString &hdr,
|
|
const QCString &d,const QCString &docFile,int docLine,
|
|
MemberListContainer con)
|
|
: m_container(container),
|
|
memberList(std::make_unique<MemberList>(MemberListType_memberGroup,con)),
|
|
grpId(id), grpHeader(hdr), doc(d), m_docFile(docFile), m_docLine(docLine)
|
|
{
|
|
//printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
|
|
memberList->setNeedsSorting(Config_getBool(SORT_BRIEF_DOCS)); // detailed sections are already sorted elsewhere.
|
|
//printf("Member group docs='%s'\n",qPrint(doc));
|
|
}
|
|
|
|
MemberGroup::~MemberGroup()
|
|
{
|
|
}
|
|
|
|
void MemberGroup::insertMember(const MemberDef *md)
|
|
{
|
|
//printf("MemberGroup::insertMember memberList=%p count=%d"
|
|
// " member section list: %p: md=%p:%s\n",
|
|
// memberList->first() ? memberList->first()->getSectionList() : 0,
|
|
// memberList->count(),
|
|
// md->getSectionList(),
|
|
// md,qPrint(md->name()));
|
|
|
|
const MemberDef *firstMd = memberList->empty() ? 0 : memberList->front();
|
|
if (inSameSection && firstMd &&
|
|
firstMd->getSectionList(m_container)!=md->getSectionList(m_container))
|
|
{
|
|
inSameSection=FALSE;
|
|
}
|
|
else if (inDeclSection==0)
|
|
{
|
|
inDeclSection = const_cast<MemberList*>(md->getSectionList(m_container));
|
|
//printf("inDeclSection=%p type=%d\n",inDeclSection,inDeclSection->listType());
|
|
}
|
|
memberList->push_back(md);
|
|
|
|
// copy the group of the first member in the memberGroup
|
|
GroupDef *gd;
|
|
if (firstMd && !firstMd->isAlias() && (gd=const_cast<GroupDef*>(firstMd->getGroupDef())))
|
|
{
|
|
MemberDefMutable *mdm = toMemberDefMutable(md);
|
|
if (mdm)
|
|
{
|
|
mdm->setGroupDef(gd, firstMd->getGroupPri(),
|
|
firstMd->getGroupFileName(),
|
|
firstMd->getGroupStartLine(),
|
|
firstMd->getGroupHasDocs());
|
|
}
|
|
gd->insertMember(md);
|
|
}
|
|
}
|
|
|
|
|
|
void MemberGroup::setAnchors()
|
|
{
|
|
memberList->setAnchors();
|
|
}
|
|
|
|
void MemberGroup::writeDeclarations(OutputList &ol,
|
|
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
|
|
bool showInline) const
|
|
{
|
|
//printf("MemberGroup::writeDeclarations() %s\n",qPrint(grpHeader));
|
|
QCString ldoc = doc;
|
|
memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc,FALSE,showInline);
|
|
}
|
|
|
|
void MemberGroup::writePlainDeclarations(OutputList &ol,bool inGroup,
|
|
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
|
|
int indentLevel,const ClassDef *inheritedFrom,const QCString &inheritId
|
|
) const
|
|
{
|
|
//printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
|
|
memberList->writePlainDeclarations(ol,inGroup,cd,nd,fd,gd,indentLevel,inheritedFrom,inheritId);
|
|
}
|
|
|
|
void MemberGroup::writeDocumentation(OutputList &ol,const QCString &scopeName,
|
|
const Definition *container,bool showEnumValues,bool showInline) const
|
|
{
|
|
//printf("MemberGroup::writeDocumentation() %s\n",qPrint(grpHeader));
|
|
memberList->writeDocumentation(ol,scopeName,container,QCString(),showEnumValues,showInline);
|
|
}
|
|
|
|
void MemberGroup::writeDocumentationPage(OutputList &ol,const QCString &scopeName,
|
|
const DefinitionMutable *container) const
|
|
{
|
|
memberList->writeDocumentationPage(ol,scopeName,container);
|
|
}
|
|
|
|
void MemberGroup::setAnonymousEnumType()
|
|
{
|
|
memberList->setAnonymousEnumType();
|
|
}
|
|
|
|
void MemberGroup::addGroupedInheritedMembers(OutputList &ol,const ClassDef *cd,
|
|
MemberListType lt,
|
|
const ClassDef *inheritedFrom,const QCString &inheritId) const
|
|
{
|
|
//printf("** addGroupedInheritedMembers()\n");
|
|
for (const auto &md : *memberList)
|
|
{
|
|
//printf("matching %d == %d\n",lt,md->getSectionList()->listType());
|
|
const MemberList *ml = md->getSectionList(m_container);
|
|
if (ml && lt==ml->listType())
|
|
{
|
|
MemberList mml(lt,MemberListContainer::Class);
|
|
mml.push_back(md);
|
|
mml.countDecMembers();
|
|
mml.writePlainDeclarations(ol,false,cd,0,0,0,0,inheritedFrom,inheritId);
|
|
}
|
|
}
|
|
}
|
|
|
|
int MemberGroup::countGroupedInheritedMembers(MemberListType lt)
|
|
{
|
|
//printf("** countGroupedInheritedMembers()\n");
|
|
int count=0;
|
|
for (const auto &md : *memberList)
|
|
{
|
|
//printf("matching %d == %d\n",lt,md->getSectionList()->listType());
|
|
const MemberList *ml = md->getSectionList(m_container);
|
|
if (ml && lt==ml->listType())
|
|
{
|
|
count++;
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
|
|
|
|
/*! Add this group as a subsection of the declaration section, instead
|
|
* of rendering it in its own section
|
|
*/
|
|
void MemberGroup::addToDeclarationSection()
|
|
{
|
|
if (inDeclSection)
|
|
{
|
|
//printf("Adding group %p to list %p (type=%d) memberList=%p\n",this,
|
|
// inDeclSection,inDeclSection->listType(),memberList);
|
|
inDeclSection->addMemberGroup(this);
|
|
}
|
|
}
|
|
|
|
void MemberGroup::countDecMembers()
|
|
{
|
|
memberList->countDecMembers();
|
|
}
|
|
|
|
void MemberGroup::countDocMembers()
|
|
{
|
|
memberList->countDocMembers();
|
|
}
|
|
|
|
const Definition *MemberGroup::container() const
|
|
{
|
|
return m_container;
|
|
}
|
|
|
|
int MemberGroup::countInheritableMembers(const ClassDef *inheritedFrom) const
|
|
{
|
|
return memberList->countInheritableMembers(inheritedFrom);
|
|
}
|
|
|
|
|
|
void MemberGroup::distributeMemberGroupDocumentation()
|
|
{
|
|
//printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",qPrint(grpHeader));
|
|
const MemberDef *md = 0;
|
|
for (const auto &smd : *memberList)
|
|
{
|
|
//printf("checking md=%s\n",qPrint(md->name()));
|
|
// find the first member of the group with documentation
|
|
if (!smd->documentation().isEmpty() ||
|
|
!smd->briefDescription().isEmpty() ||
|
|
!smd->inbodyDocumentation().isEmpty()
|
|
)
|
|
{
|
|
//printf("found it!\n");
|
|
md = smd;
|
|
break;
|
|
}
|
|
}
|
|
if (md) // distribute docs of md to other members of the list
|
|
{
|
|
//printf("Member %s has documentation!\n",qPrint(md->name()));
|
|
for (const auto &iomd : *memberList)
|
|
{
|
|
MemberDefMutable *omd = toMemberDefMutable(iomd);
|
|
if (omd && md!=omd && omd->documentation().isEmpty() &&
|
|
omd->briefDescription().isEmpty() &&
|
|
omd->inbodyDocumentation().isEmpty()
|
|
)
|
|
{
|
|
//printf("Copying documentation to member %s\n",qPrint(omd->name()));
|
|
omd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
|
|
omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
|
|
omd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int MemberGroup::numDecMembers() const
|
|
{
|
|
return memberList->numDecMembers();
|
|
}
|
|
|
|
int MemberGroup::numDecEnumValues() const
|
|
{
|
|
return memberList->numDecEnumValues();
|
|
}
|
|
|
|
int MemberGroup::numDocMembers() const
|
|
{
|
|
return memberList->numDocMembers();
|
|
}
|
|
|
|
int MemberGroup::numDocEnumValues() const
|
|
{
|
|
return memberList->numDocEnumValues();
|
|
}
|
|
|
|
void MemberGroup::addListReferences(Definition *def)
|
|
{
|
|
memberList->addListReferences(def);
|
|
}
|
|
|
|
void MemberGroup::findSectionsInDocumentation(const Definition *d)
|
|
{
|
|
docFindSections(doc,d,m_docFile);
|
|
memberList->findSectionsInDocumentation(d);
|
|
}
|
|
|
|
void MemberGroup::setRefItems(const RefItemVector &sli)
|
|
{
|
|
m_xrefListItems.insert(m_xrefListItems.end(), sli.cbegin(), sli.cend());
|
|
}
|
|
|
|
void MemberGroup::writeTagFile(TextStream &tagFile)
|
|
{
|
|
memberList->writeTagFile(tagFile);
|
|
}
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
void MemberGroupInfo::setRefItems(const RefItemVector &sli)
|
|
{
|
|
m_sli.insert(m_sli.end(), sli.cbegin(), sli.cend());
|
|
}
|