Blame src/membergroup.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include "membergroup.h"
Packit 1c1d7e
#include "memberlist.h"
Packit 1c1d7e
#include "outputlist.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "classdef.h"
Packit 1c1d7e
#include "namespacedef.h"
Packit 1c1d7e
#include "filedef.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
#include "groupdef.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
#include "marshal.h"
Packit 1c1d7e
#include "entry.h"
Packit 1c1d7e
#include "md5.h"
Packit 1c1d7e
Packit 1c1d7e
//static QCString idToName(int id)
Packit 1c1d7e
//{
Packit 1c1d7e
//  QCString result;
Packit 1c1d7e
//  result.sprintf("mgroup_%d",id);
Packit 1c1d7e
//  return result;
Packit 1c1d7e
//}
Packit 1c1d7e
Packit 1c1d7e
MemberGroup::MemberGroup()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberGroup::MemberGroup(Definition *parent,
Packit 1c1d7e
      int id,const char *hdr,const char *d,const char *docFile,int docLine)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
Packit 1c1d7e
  memberList      = new MemberList(MemberListType_memberGroup);
Packit 1c1d7e
  grpId           = id;
Packit 1c1d7e
  grpHeader       = hdr;
Packit 1c1d7e
  doc             = d;
Packit 1c1d7e
  scope           = 0;
Packit 1c1d7e
  inSameSection   = TRUE;
Packit 1c1d7e
  inDeclSection   = 0;
Packit 1c1d7e
  m_numDecMembers = -1;
Packit 1c1d7e
  m_numDocMembers = -1;
Packit 1c1d7e
  m_parent        = parent;
Packit 1c1d7e
  m_docFile       = docFile;
Packit 1c1d7e
  m_docLine       = docLine;
Packit 1c1d7e
  m_xrefListItems = 0;
Packit 1c1d7e
  //printf("Member group docs=`%s'\n",doc.data());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberGroup::~MemberGroup()
Packit 1c1d7e
{
Packit 1c1d7e
  delete memberList;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::insertMember(MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("MemberGroup::insertMember m_parent=%s memberList=%p count=%d"
Packit 1c1d7e
  //       " member section list: %p: md=%p:%s\n",
Packit 1c1d7e
  //       m_parent ? m_parent->name().data() : "<null>",
Packit 1c1d7e
  //       memberList->first() ? memberList->first()->getSectionList(m_parent) : 0,
Packit 1c1d7e
  //       memberList->count(),
Packit 1c1d7e
  //       md->getSectionList(m_parent),
Packit 1c1d7e
  //       md,md->name().data());
Packit 1c1d7e
Packit 1c1d7e
  MemberDef *firstMd = memberList->getFirst();
Packit 1c1d7e
  if (inSameSection && firstMd &&
Packit 1c1d7e
      firstMd->getSectionList(m_parent)!=md->getSectionList(m_parent))
Packit 1c1d7e
  {
Packit 1c1d7e
    inSameSection=FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (inDeclSection==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    inDeclSection = md->getSectionList(m_parent);
Packit 1c1d7e
    //printf("inDeclSection=%p type=%d\n",inDeclSection,inDeclSection->listType());
Packit 1c1d7e
  }
Packit 1c1d7e
  memberList->append(md);
Packit 1c1d7e
Packit 1c1d7e
  // copy the group of the first member in the memberGroup
Packit 1c1d7e
  GroupDef *gd;
Packit 1c1d7e
  if (firstMd && (gd=firstMd->getGroupDef()))
Packit 1c1d7e
  {
Packit 1c1d7e
    md->setGroupDef(gd, firstMd->getGroupPri(), 
Packit 1c1d7e
                    firstMd->getGroupFileName(), firstMd->getGroupStartLine(), 
Packit 1c1d7e
                    firstMd->getGroupHasDocs());
Packit 1c1d7e
    gd->insertMember(md);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::setAnchors()
Packit 1c1d7e
{
Packit 1c1d7e
  ::setAnchors(memberList);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::writeDeclarations(OutputList &ol,
Packit 1c1d7e
               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
Packit 1c1d7e
               bool showInline)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("MemberGroup::writeDeclarations() %s\n",grpHeader.data());
Packit 1c1d7e
  QCString ldoc = doc;
Packit 1c1d7e
  if (!ldoc.isEmpty()) ldoc.prepend("");
Packit 1c1d7e
  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc,FALSE,showInline);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::writePlainDeclarations(OutputList &ol,
Packit 1c1d7e
               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
Packit 1c1d7e
               ClassDef *inheritedFrom,const char *inheritId
Packit 1c1d7e
              )
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
Packit 1c1d7e
  memberList->writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::writeDocumentation(OutputList &ol,const char *scopeName,
Packit 1c1d7e
               Definition *container,bool showEnumValues,bool showInline)
Packit 1c1d7e
{
Packit 1c1d7e
  memberList->writeDocumentation(ol,scopeName,container,0,showEnumValues,showInline);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::writeDocumentationPage(OutputList &ol,const char *scopeName,
Packit 1c1d7e
               Definition *container)
Packit 1c1d7e
{
Packit 1c1d7e
  memberList->writeDocumentationPage(ol,scopeName,container);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::addGroupedInheritedMembers(OutputList &ol,ClassDef *cd,
Packit 1c1d7e
               MemberListType lt,
Packit 1c1d7e
               ClassDef *inheritedFrom,const QCString &inheritId)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("** addGroupedInheritedMembers()\n");
Packit 1c1d7e
  MemberListIterator li(*memberList);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for (li.toFirst();(md=li.current());++li)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("matching %d == %d\n",lt,md->getSectionList(m_parent)->listType());
Packit 1c1d7e
    MemberList *ml = md->getSectionList(m_parent);
Packit 1c1d7e
    if (ml && lt==ml->listType())
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberList ml(lt);
Packit 1c1d7e
      ml.append(md);
Packit 1c1d7e
      ml.writePlainDeclarations(ol,cd,0,0,0,inheritedFrom,inheritId);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::countGroupedInheritedMembers(MemberListType lt)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("** countGroupedInheritedMembers()\n");
Packit 1c1d7e
  int count=0;
Packit 1c1d7e
  MemberListIterator li(*memberList);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for (li.toFirst();(md=li.current());++li)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("matching %d == %d\n",lt,md->getSectionList(m_parent)->listType());
Packit 1c1d7e
    MemberList *ml = md->getSectionList(m_parent);
Packit 1c1d7e
    if (ml && lt==ml->listType())
Packit 1c1d7e
    {
Packit 1c1d7e
      count++;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return count;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*! Add this group as a subsection of the declaration section, instead
Packit 1c1d7e
 *  of rendering it in its own section
Packit 1c1d7e
 */
Packit 1c1d7e
void MemberGroup::addToDeclarationSection()
Packit 1c1d7e
{
Packit 1c1d7e
  if (inDeclSection)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("Adding group %p to list %p (type=%d)\n",this,
Packit 1c1d7e
    //                              inDeclSection,inDeclSection->listType());
Packit 1c1d7e
    inDeclSection->addMemberGroup(this);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::countDecMembers(GroupDef *gd)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_numDecMembers==-1) /* number of member not cached */
Packit 1c1d7e
  {
Packit 1c1d7e
    memberList->countDecMembers(gd);
Packit 1c1d7e
    m_numDecMembers = memberList->numDecMembers();
Packit 1c1d7e
  }
Packit 1c1d7e
  return m_numDecMembers;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::countDocMembers()
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_numDocMembers==-1)
Packit 1c1d7e
  {
Packit 1c1d7e
    memberList->countDocMembers();
Packit 1c1d7e
    m_numDocMembers = memberList->numDocMembers();
Packit 1c1d7e
  }
Packit 1c1d7e
  return m_numDocMembers;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::countInheritableMembers(ClassDef *inheritedFrom) const
Packit 1c1d7e
{
Packit 1c1d7e
  return memberList->countInheritableMembers(inheritedFrom);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::distributeMemberGroupDocumentation()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",grpHeader.data());
Packit 1c1d7e
  MemberListIterator li(*memberList);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for (li.toFirst();(md=li.current());++li)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("checking md=%s\n",md->name().data());
Packit 1c1d7e
    // find the first member of the group with documentation
Packit 1c1d7e
    if (!md->documentation().isEmpty()       ||
Packit 1c1d7e
        !md->briefDescription().isEmpty()    ||
Packit 1c1d7e
        !md->inbodyDocumentation().isEmpty()
Packit 1c1d7e
       )
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("found it!\n");
Packit 1c1d7e
      break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (md) // distribute docs of md to other members of the list
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("Member %s has documentation!\n",md->name().data());
Packit 1c1d7e
    MemberDef *omd;
Packit 1c1d7e
    for (li.toFirst();(omd=li.current());++li)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (md!=omd && omd->documentation().isEmpty() &&
Packit 1c1d7e
                     omd->briefDescription().isEmpty() &&
Packit 1c1d7e
                     omd->inbodyDocumentation().isEmpty()
Packit 1c1d7e
         )
Packit 1c1d7e
      {
Packit 1c1d7e
        //printf("Copying documentation to member %s\n",omd->name().data());
Packit 1c1d7e
        omd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
Packit 1c1d7e
        omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
Packit 1c1d7e
        omd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::varCount() const
Packit 1c1d7e
{
Packit 1c1d7e
  return memberList->varCount();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::funcCount() const      
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->funcCount(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::enumCount() const      
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->enumCount(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::enumValueCount() const 
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->enumValueCount(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::typedefCount() const   
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->typedefCount(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::protoCount() const     
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->protoCount(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::defineCount() const    
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->defineCount(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::friendCount() const    
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->friendCount(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::numDecMembers() const  
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->numDecMembers(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberGroup::numDocMembers() const  
Packit 1c1d7e
{ 
Packit 1c1d7e
  return memberList->numDocMembers(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::setInGroup(bool b)
Packit 1c1d7e
{
Packit 1c1d7e
  memberList->setInGroup(b);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QCString MemberGroup::anchor() const
Packit 1c1d7e
{
Packit 1c1d7e
  uchar md5_sig[16];
Packit 1c1d7e
  QCString sigStr(33);
Packit 1c1d7e
  QCString locHeader = grpHeader;
Packit 1c1d7e
  if (locHeader.isEmpty()) locHeader="[NOHEADER]";
Packit 1c1d7e
  MD5Buffer((const unsigned char *)locHeader.data(),locHeader.length(),md5_sig);
Packit 1c1d7e
  MD5SigToString(md5_sig,sigStr.rawData(),33);
Packit 1c1d7e
  return "amgrp"+sigStr;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::addListReferences(Definition *def)
Packit 1c1d7e
{
Packit 1c1d7e
  memberList->addListReferences(def);
Packit 1c1d7e
  if (m_xrefListItems && def)
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString name = def->getOutputFileBase()+"#"+anchor();
Packit 1c1d7e
    addRefItem(m_xrefListItems,
Packit 1c1d7e
        name,
Packit 1c1d7e
        theTranslator->trGroup(TRUE,TRUE),
Packit 1c1d7e
        name,
Packit 1c1d7e
        grpHeader,0,def);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::findSectionsInDocumentation()
Packit 1c1d7e
{
Packit 1c1d7e
  docFindSections(doc,0,this,m_docFile);
Packit 1c1d7e
  memberList->findSectionsInDocumentation();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::marshal(StorageIntf *s)
Packit 1c1d7e
{
Packit 1c1d7e
  marshalMemberList(s,memberList);
Packit 1c1d7e
  marshalObjPointer(s,inDeclSection); // reference only
Packit 1c1d7e
  marshalInt(s,grpId);
Packit 1c1d7e
  marshalQCString(s,grpHeader);
Packit 1c1d7e
  marshalQCString(s,fileName);
Packit 1c1d7e
  marshalObjPointer(s,scope);
Packit 1c1d7e
  marshalQCString(s,doc);
Packit 1c1d7e
  marshalBool(s,inSameSection);
Packit 1c1d7e
  marshalInt(s,m_numDecMembers);
Packit 1c1d7e
  marshalInt(s,m_numDocMembers);
Packit 1c1d7e
  marshalObjPointer(s,m_parent);
Packit 1c1d7e
  marshalQCString(s,m_docFile);
Packit 1c1d7e
  marshalItemInfoList (Doxygen::symbolStorage,m_xrefListItems);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::unmarshal(StorageIntf *s)
Packit 1c1d7e
{
Packit 1c1d7e
  memberList      = unmarshalMemberList(s);
Packit 1c1d7e
  inDeclSection   = (MemberList *)unmarshalObjPointer(s); 
Packit 1c1d7e
  grpId           = unmarshalInt(s);
Packit 1c1d7e
  grpHeader       = unmarshalQCString(s);
Packit 1c1d7e
  fileName        = unmarshalQCString(s);
Packit 1c1d7e
  scope           = (Definition *)unmarshalObjPointer(s);
Packit 1c1d7e
  doc             = unmarshalQCString(s);
Packit 1c1d7e
  inSameSection   = unmarshalBool(s);
Packit 1c1d7e
  m_numDecMembers = unmarshalInt(s);
Packit 1c1d7e
  m_numDocMembers = unmarshalInt(s);
Packit 1c1d7e
  m_parent        = (Definition *)unmarshalObjPointer(s);
Packit 1c1d7e
  m_docFile       = unmarshalQCString(s);
Packit 1c1d7e
  m_xrefListItems = unmarshalItemInfoList (Doxygen::symbolStorage);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::setRefItems(const QList<ListItemInfo> *sli)
Packit 1c1d7e
{
Packit 1c1d7e
  if (sli)
Packit 1c1d7e
  {
Packit 1c1d7e
    // deep copy the list
Packit 1c1d7e
    if (m_xrefListItems==0) 
Packit 1c1d7e
    {
Packit 1c1d7e
      m_xrefListItems=new QList<ListItemInfo>;
Packit 1c1d7e
      m_xrefListItems->setAutoDelete(TRUE);
Packit 1c1d7e
    }
Packit 1c1d7e
    QListIterator<ListItemInfo> slii(*sli);
Packit 1c1d7e
    ListItemInfo *lii;
Packit 1c1d7e
    for (slii.toFirst();(lii=slii.current());++slii)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_xrefListItems->append(new ListItemInfo(*lii));
Packit 1c1d7e
    } 
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberGroup::writeTagFile(FTextStream &tagFile)
Packit 1c1d7e
{
Packit 1c1d7e
  memberList->writeTagFile(tagFile);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//--------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
void MemberGroupInfo::setRefItems(const QList<ListItemInfo> *sli)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!sli) return;
Packit 1c1d7e
  if (m_sli==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_sli = new QList<ListItemInfo>;
Packit 1c1d7e
    m_sli->setAutoDelete(TRUE);
Packit 1c1d7e
  }
Packit 1c1d7e
  QListIterator<ListItemInfo> slii(*sli);
Packit 1c1d7e
  ListItemInfo *ili;
Packit 1c1d7e
  for (slii.toFirst();(ili=slii.current());++slii)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_sli->append(new ListItemInfo(*ili));
Packit 1c1d7e
  }
Packit 1c1d7e
}