Blame src/memberlist.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 <qregexp.h>
Packit 1c1d7e
Packit 1c1d7e
#include "memberlist.h"
Packit 1c1d7e
#include "classdef.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "outputlist.h"
Packit 1c1d7e
#include "groupdef.h"
Packit 1c1d7e
#include "marshal.h"
Packit 1c1d7e
#include "vhdldocgen.h"
Packit 1c1d7e
#include "namespacedef.h"
Packit 1c1d7e
#include "filedef.h"
Packit 1c1d7e
#include "membergroup.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
Packit 1c1d7e
MemberList::MemberList() : m_listType(MemberListType_pubMethods)
Packit 1c1d7e
{
Packit 1c1d7e
  memberGroupList=0;
Packit 1c1d7e
  m_varCnt=0;
Packit 1c1d7e
  m_funcCnt=0;
Packit 1c1d7e
  m_enumCnt=0;
Packit 1c1d7e
  m_enumValCnt=0;
Packit 1c1d7e
  m_typeCnt=0;
Packit 1c1d7e
  m_protoCnt=0;
Packit 1c1d7e
  m_defCnt=0;
Packit 1c1d7e
  m_friendCnt=0;
Packit 1c1d7e
  m_numDecMembers=-1; // special value indicating that value needs to be computed
Packit 1c1d7e
  m_numDocMembers=-1; // special value indicating that value needs to be computed
Packit 1c1d7e
  m_inGroup=FALSE;
Packit 1c1d7e
  m_inFile=FALSE;
Packit 1c1d7e
  m_needsSorting=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberList::MemberList(MemberListType lt) : m_listType(lt)
Packit 1c1d7e
{
Packit 1c1d7e
  memberGroupList=0;
Packit 1c1d7e
  m_varCnt=0;
Packit 1c1d7e
  m_funcCnt=0;
Packit 1c1d7e
  m_enumCnt=0;
Packit 1c1d7e
  m_enumValCnt=0;
Packit 1c1d7e
  m_typeCnt=0;
Packit 1c1d7e
  m_protoCnt=0;
Packit 1c1d7e
  m_defCnt=0;
Packit 1c1d7e
  m_friendCnt=0;
Packit 1c1d7e
  m_numDecMembers=-1; // special value indicating that value needs to be computed
Packit 1c1d7e
  m_numDocMembers=-1; // special value indicating that value needs to be computed
Packit 1c1d7e
  m_inGroup=FALSE;
Packit 1c1d7e
  m_inFile=FALSE;
Packit 1c1d7e
  m_needsSorting=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberList::~MemberList()
Packit 1c1d7e
{
Packit 1c1d7e
  delete memberGroupList;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberList::compareValues(const MemberDef *c1, const MemberDef *c2) const
Packit 1c1d7e
{
Packit 1c1d7e
  static bool sortConstructorsFirst = Config_getBool(SORT_MEMBERS_CTORS_1ST);
Packit 1c1d7e
  if (sortConstructorsFirst) {
Packit 1c1d7e
    int ord1 = c1->isConstructor() ? 2 : (c1->isDestructor() ? 1 : 0);
Packit 1c1d7e
    int ord2 = c2->isConstructor() ? 2 : (c2->isDestructor() ? 1 : 0);
Packit 1c1d7e
    if (ord1 > ord2)
Packit 1c1d7e
      return -1;
Packit 1c1d7e
    else if (ord2 > ord1)
Packit 1c1d7e
      return 1;
Packit 1c1d7e
  }
Packit 1c1d7e
  int cmp = qstricmp(c1->name(),c2->name());
Packit 1c1d7e
  return cmp!=0 ? cmp : c1->getDefLine()-c2->getDefLine();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberList::countInheritableMembers(ClassDef *inheritedFrom) const
Packit 1c1d7e
{
Packit 1c1d7e
  int count=0;
Packit 1c1d7e
  QListIterator<MemberDef> mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isBriefSectionVisible())
Packit 1c1d7e
    {
Packit 1c1d7e
      if (md->memberType()!=MemberType_Friend &&
Packit 1c1d7e
          md->memberType()!=MemberType_EnumValue)
Packit 1c1d7e
      {
Packit 1c1d7e
        //printf("member %s: isReimplementedBy(%s)=%d\n",md->name().data(),
Packit 1c1d7e
        //    inheritedFrom->name().data(),
Packit 1c1d7e
        //    md->isReimplementedBy(inheritedFrom));
Packit 1c1d7e
        if (md->memberType()==MemberType_Function)
Packit 1c1d7e
        {
Packit 1c1d7e
          if (!md->isReimplementedBy(inheritedFrom)) count++;
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          count++;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (memberGroupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      count+=mg->countInheritableMembers(inheritedFrom);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("%s::countInheritableMembers(%s)=%d\n",
Packit 1c1d7e
  //    listTypeAsString().data(),
Packit 1c1d7e
  //    inheritedFrom->name().data(),count);
Packit 1c1d7e
  return count;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*! Count the number of members in this list that are visible in
Packit 1c1d7e
 *  the declaration part of a compound's documentation page.
Packit 1c1d7e
 */
Packit 1c1d7e
void MemberList::countDecMembers(bool countEnumValues,GroupDef *gd)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_numDecMembers!=-1) return; 
Packit 1c1d7e
  
Packit 1c1d7e
  //printf("----- countDecMembers count=%d ----\n",count());
Packit 1c1d7e
  m_varCnt=m_funcCnt=m_enumCnt=m_enumValCnt=0;
Packit 1c1d7e
  m_typeCnt=m_protoCnt=m_defCnt=m_friendCnt=0;
Packit 1c1d7e
  m_numDecMembers=0;
Packit 1c1d7e
  QListIterator<MemberDef> mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("MemberList::countDecMembers(md=%s,%d)\n",md->name().data(),md->isBriefSectionVisible());
Packit 1c1d7e
    if (md->isBriefSectionVisible())
Packit 1c1d7e
    {
Packit 1c1d7e
      switch(md->memberType())
Packit 1c1d7e
      {
Packit 1c1d7e
        case MemberType_Variable:    // fall through
Packit 1c1d7e
        case MemberType_Event:       // fall through
Packit 1c1d7e
        case MemberType_Property:    m_varCnt++,m_numDecMembers++;  
Packit 1c1d7e
                                     break;
Packit 1c1d7e
// apparently necessary to get this to show up in declarations section?
Packit 1c1d7e
        case MemberType_Interface:   // fall through
Packit 1c1d7e
        case MemberType_Service:     // fall through
Packit 1c1d7e
        case MemberType_Function:    // fall through
Packit 1c1d7e
        case MemberType_Signal:      // fall through
Packit 1c1d7e
        case MemberType_DCOP:        // fall through
Packit 1c1d7e
        case MemberType_Slot:        if (!md->isRelated() || md->getClassDef())
Packit 1c1d7e
                                       m_funcCnt++,m_numDecMembers++; 
Packit 1c1d7e
                                     break;
Packit 1c1d7e
        case MemberType_Enumeration: m_enumCnt++,m_numDecMembers++; break;
Packit 1c1d7e
        case MemberType_EnumValue:   if (countEnumValues)
Packit 1c1d7e
                                       m_enumValCnt++,m_numDecMembers++; 
Packit 1c1d7e
                                     break;
Packit 1c1d7e
        case MemberType_Typedef:     m_typeCnt++,m_numDecMembers++; break;
Packit 1c1d7e
        //case MemberType_Prototype:   m_protoCnt++,m_numDecMembers++; break;
Packit 1c1d7e
        case MemberType_Define:      if (Config_getBool(EXTRACT_ALL) || 
Packit 1c1d7e
                                         md->argsString() || 
Packit 1c1d7e
                                         !md->initializer().isEmpty() ||
Packit 1c1d7e
                                         md->hasDocumentation() 
Packit 1c1d7e
                                        ) m_defCnt++,m_numDecMembers++;     
Packit 1c1d7e
                                     break;
Packit 1c1d7e
        case MemberType_Friend:      m_friendCnt++,m_numDecMembers++;  
Packit 1c1d7e
                                     break;
Packit 1c1d7e
        default:
Packit 1c1d7e
          err("Unknown member type found for member `%s'\n!",md->name().data());
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (memberGroupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->countDecMembers(gd);
Packit 1c1d7e
      m_varCnt+=mg->varCount();
Packit 1c1d7e
      m_funcCnt+=mg->funcCount();
Packit 1c1d7e
      m_enumCnt+=mg->enumCount();
Packit 1c1d7e
      m_enumValCnt+=mg->enumValueCount();
Packit 1c1d7e
      m_typeCnt+=mg->typedefCount();
Packit 1c1d7e
      m_protoCnt+=mg->protoCount();
Packit 1c1d7e
      m_defCnt+=mg->defineCount();
Packit 1c1d7e
      m_friendCnt+=mg->friendCount();
Packit 1c1d7e
      m_numDecMembers+=mg->numDecMembers();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("----- end countDecMembers ----\n");
Packit 1c1d7e
Packit 1c1d7e
  //printf("MemberList::countDecMembers()=%d\n",m_numDecMembers);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::countDocMembers(bool countEnumValues)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_numDocMembers!=-1) return; // used cached value
Packit 1c1d7e
  m_numDocMembers=0;
Packit 1c1d7e
  QListIterator<MemberDef> mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isDetailedSectionVisible(m_inGroup,m_inFile)) 
Packit 1c1d7e
    {
Packit 1c1d7e
      // do not count enum values, since they do not produce entries of their own
Packit 1c1d7e
      if (countEnumValues || md->memberType()!=MemberType_EnumValue) 
Packit 1c1d7e
        m_numDocMembers++;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (memberGroupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->countDocMembers();
Packit 1c1d7e
      m_numDocMembers+=mg->numDocMembers();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("MemberList::countDocMembers()=%d memberGroupList=%p\n",m_numDocMembers,memberGroupList);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::inSort(const MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  QList<MemberDef>::inSort(md);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::append(const MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  QList<MemberDef>::append(md);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::remove(const MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  QList<MemberDef>::remove(md);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::sort()
Packit 1c1d7e
{
Packit 1c1d7e
  QList<MemberDef>::sort();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
uint MemberList::count() const
Packit 1c1d7e
{
Packit 1c1d7e
  return QList<MemberDef>::count();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberList::findRef(const MemberDef *md) const
Packit 1c1d7e
{
Packit 1c1d7e
  return QList<MemberDef>::findRef(md);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberDef *MemberList::getFirst() const
Packit 1c1d7e
{
Packit 1c1d7e
  return QList<MemberDef>::getFirst();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberDef *MemberList::take(uint index)
Packit 1c1d7e
{
Packit 1c1d7e
  return QList<MemberDef>::take(index);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberListIterator::MemberListIterator(const MemberList &l) :
Packit 1c1d7e
  QListIterator<MemberDef>(l) 
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int MemberList::countEnumValues(MemberDef *md,bool setAnonEnumType) const
Packit 1c1d7e
{
Packit 1c1d7e
  int enumVars=0;
Packit 1c1d7e
  MemberListIterator vmli(*this);
Packit 1c1d7e
  MemberDef *vmd;
Packit 1c1d7e
  QCString name(md->name());
Packit 1c1d7e
  int i=name.findRev("::");
Packit 1c1d7e
  if (i!=-1) name=name.right(name.length()-i-2); // strip scope (TODO: is this needed?)
Packit 1c1d7e
  if (name[0]=='@') // anonymous enum => append variables
Packit 1c1d7e
  {
Packit 1c1d7e
    for ( ; (vmd=vmli.current()) ; ++vmli)
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString vtype=vmd->typeString();
Packit 1c1d7e
      if ((vtype.find(name))!=-1) 
Packit 1c1d7e
      {
Packit 1c1d7e
        enumVars++;
Packit 1c1d7e
        if (setAnonEnumType)
Packit 1c1d7e
        {
Packit 1c1d7e
          vmd->setAnonymousEnumType(md);
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return enumVars;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool MemberList::declVisible() const
Packit 1c1d7e
{
Packit 1c1d7e
  MemberListIterator mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for ( ; (md=mli.current()); ++mli )
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isBriefSectionVisible())
Packit 1c1d7e
    {
Packit 1c1d7e
      switch (md->memberType())
Packit 1c1d7e
      {
Packit 1c1d7e
        case MemberType_Define:    // fall through
Packit 1c1d7e
        case MemberType_Typedef:   // fall through
Packit 1c1d7e
        case MemberType_Variable:  // fall through
Packit 1c1d7e
        case MemberType_Function:  // fall through
Packit 1c1d7e
        case MemberType_Signal:    // fall through
Packit 1c1d7e
        case MemberType_Slot:      // fall through
Packit 1c1d7e
        case MemberType_DCOP:      // fall through
Packit 1c1d7e
        case MemberType_Property:  // fall through
Packit 1c1d7e
        case MemberType_Interface: // fall through
Packit 1c1d7e
        case MemberType_Service:   // fall through
Packit 1c1d7e
        case MemberType_Event:  
Packit 1c1d7e
          return TRUE;
Packit 1c1d7e
        case MemberType_Enumeration: 
Packit 1c1d7e
          {
Packit 1c1d7e
            // if this is an anonymous enum and there are variables of this
Packit 1c1d7e
            // enum type (i.e. enumVars>0), then we do not show the enum here.
Packit 1c1d7e
            if (countEnumValues(md,FALSE)==0) // show enum here
Packit 1c1d7e
            {
Packit 1c1d7e
              return TRUE;
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
          break;
Packit 1c1d7e
        case MemberType_Friend:
Packit 1c1d7e
          return TRUE;
Packit 1c1d7e
        case MemberType_EnumValue: 
Packit 1c1d7e
          {
Packit 1c1d7e
            if (m_inGroup)
Packit 1c1d7e
            {
Packit 1c1d7e
              return TRUE;
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
          break;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::writePlainDeclarations(OutputList &ol,
Packit 1c1d7e
                       ClassDef *cd,NamespaceDef *nd,FileDef *fd,
Packit 1c1d7e
                       GroupDef *gd,ClassDef *inheritedFrom,const char *inheritId
Packit 1c1d7e
                      )
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("----- writePlainDeclaration() ----\n");
Packit 1c1d7e
  static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
Packit 1c1d7e
  countDecMembers();
Packit 1c1d7e
  if (numDecMembers()==0) 
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("  --> no members!\n");
Packit 1c1d7e
    return; // no members in this list
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("  --> writePlainDeclaration() numDecMembers()=%d\n",
Packit 1c1d7e
  //    numDecMembers());
Packit 1c1d7e
  
Packit 1c1d7e
  ol.pushGeneratorState();
Packit 1c1d7e
Packit 1c1d7e
  bool first=TRUE;
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  MemberListIterator mli(*this);
Packit 1c1d7e
  for ( ; (md=mli.current()); ++mli )
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf(">>> Member `%s' type=%d visible=%d\n",
Packit 1c1d7e
    //    md->name().data(),md->memberType(),md->isBriefSectionVisible());
Packit 1c1d7e
    if ((inheritedFrom==0 || !md->isReimplementedBy(inheritedFrom)) &&
Packit 1c1d7e
        md->isBriefSectionVisible())
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf(">>> rendering\n");
Packit 1c1d7e
      switch(md->memberType())
Packit 1c1d7e
      {
Packit 1c1d7e
        case MemberType_Define:    // fall through
Packit 1c1d7e
        //case MemberType_Prototype: // fall through
Packit 1c1d7e
        case MemberType_Typedef:   // fall through
Packit 1c1d7e
        case MemberType_Variable:  // fall through
Packit 1c1d7e
        case MemberType_Function:  // fall through
Packit 1c1d7e
        case MemberType_Signal:    // fall through
Packit 1c1d7e
        case MemberType_Slot:      // fall through
Packit 1c1d7e
        case MemberType_DCOP:      // fall through
Packit 1c1d7e
        case MemberType_Property:  // fall through
Packit 1c1d7e
        case MemberType_Interface: // fall through
Packit 1c1d7e
        case MemberType_Service:   // fall through
Packit 1c1d7e
        case MemberType_Event:  
Packit 1c1d7e
          {
Packit 1c1d7e
            if (first) ol.startMemberList(),first=FALSE;
Packit 1c1d7e
            md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
Packit 1c1d7e
            break;
Packit 1c1d7e
          }
Packit 1c1d7e
        case MemberType_Enumeration: 
Packit 1c1d7e
          {
Packit 1c1d7e
            // if this is an anonymous enum and there are variables of this
Packit 1c1d7e
            // enum type (i.e. enumVars>0), then we do not show the enum here.
Packit 1c1d7e
            if (countEnumValues(md,TRUE)==0) // show enum here
Packit 1c1d7e
            {
Packit 1c1d7e
              //printf("Enum!!\n");
Packit 1c1d7e
              if (first)
Packit 1c1d7e
              {
Packit 1c1d7e
                ol.startMemberList();
Packit 1c1d7e
                first=FALSE;
Packit 1c1d7e
              }
Packit 1c1d7e
              ol.startMemberDeclaration();
Packit 1c1d7e
              ol.startMemberItem(md->anchor(),0,inheritId);
Packit 1c1d7e
              bool detailsLinkable = md->isDetailedSectionLinkable();
Packit 1c1d7e
              if (!detailsLinkable)
Packit 1c1d7e
              {
Packit 1c1d7e
                ol.startDoxyAnchor(md->getOutputFileBase(),0,md->anchor(),md->name(),QCString());
Packit 1c1d7e
              }
Packit 1c1d7e
              ol.writeString("enum ");
Packit 1c1d7e
              ol.insertMemberAlign();
Packit 1c1d7e
              md->writeEnumDeclaration(ol,cd,nd,fd,gd);
Packit 1c1d7e
              if (!detailsLinkable)
Packit 1c1d7e
              {
Packit 1c1d7e
                ol.endDoxyAnchor(md->getOutputFileBase(),md->anchor());
Packit 1c1d7e
              }
Packit 1c1d7e
              ol.endMemberItem();
Packit 1c1d7e
              if (!md->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
Packit 1c1d7e
              {
Packit 1c1d7e
                DocRoot *rootNode = validatingParseDoc(
Packit 1c1d7e
                    md->briefFile(),md->briefLine(),
Packit 1c1d7e
                    cd,md,
Packit 1c1d7e
                    md->briefDescription(),
Packit 1c1d7e
                    TRUE,FALSE,0,TRUE,FALSE
Packit 1c1d7e
                    );
Packit 1c1d7e
                if (rootNode && !rootNode->isEmpty())
Packit 1c1d7e
                {
Packit 1c1d7e
                  ol.startMemberDescription(md->anchor());
Packit 1c1d7e
                  ol.writeDoc(rootNode,cd,md);
Packit 1c1d7e
                  if (md->isDetailedSectionLinkable())
Packit 1c1d7e
                  {
Packit 1c1d7e
                    ol.disableAllBut(OutputGenerator::Html);
Packit 1c1d7e
                    ol.docify(" ");
Packit 1c1d7e
                    ol.startTextLink(md->getOutputFileBase(),
Packit 1c1d7e
                        md->anchor());
Packit 1c1d7e
                    ol.parseText(theTranslator->trMore());
Packit 1c1d7e
                    ol.endTextLink();
Packit 1c1d7e
                    ol.enableAll();
Packit 1c1d7e
                  }
Packit 1c1d7e
                  ol.endMemberDescription();
Packit 1c1d7e
                }
Packit 1c1d7e
                delete rootNode;
Packit 1c1d7e
              }
Packit 1c1d7e
              ol.endMemberDeclaration(md->anchor(),inheritId);
Packit 1c1d7e
            }
Packit 1c1d7e
            md->warnIfUndocumented();
Packit 1c1d7e
            break;
Packit 1c1d7e
          }
Packit 1c1d7e
        case MemberType_Friend:
Packit 1c1d7e
          if (inheritedFrom==0)
Packit 1c1d7e
          {
Packit 1c1d7e
            if (first) 
Packit 1c1d7e
            {
Packit 1c1d7e
              ol.startMemberList();
Packit 1c1d7e
              first=FALSE;
Packit 1c1d7e
            }
Packit 1c1d7e
            md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
Packit 1c1d7e
            break;
Packit 1c1d7e
          }
Packit 1c1d7e
        case MemberType_EnumValue: 
Packit 1c1d7e
          {
Packit 1c1d7e
            if (m_inGroup)
Packit 1c1d7e
            {
Packit 1c1d7e
              //printf("EnumValue!\n");
Packit 1c1d7e
              if (first) ol.startMemberList(),first=FALSE;
Packit 1c1d7e
              md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup,inheritedFrom,inheritId);
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
          break;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // handle members that are inside anonymous compounds and for which
Packit 1c1d7e
  // no variables of the anonymous compound type exist.
Packit 1c1d7e
  if (cd)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberListIterator mli(*this);
Packit 1c1d7e
    for  ( ; (md=mli.current()) ; ++mli )
Packit 1c1d7e
    {
Packit 1c1d7e
      if (md->fromAnonymousScope() && !md->anonymousDeclShown())
Packit 1c1d7e
      {
Packit 1c1d7e
        md->setFromAnonymousScope(FALSE);
Packit 1c1d7e
        //printf("anonymous compound members\n");
Packit 1c1d7e
        if (md->isBriefSectionVisible())
Packit 1c1d7e
        {
Packit 1c1d7e
          if (first) 
Packit 1c1d7e
          {
Packit 1c1d7e
            ol.startMemberList();
Packit 1c1d7e
            first=FALSE;
Packit 1c1d7e
          }
Packit 1c1d7e
          md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
Packit 1c1d7e
        }
Packit 1c1d7e
        md->setFromAnonymousScope(TRUE);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
 
Packit 1c1d7e
  if (!first) 
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.endMemberList(); 
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  ol.popGeneratorState();
Packit 1c1d7e
  //printf("----- end writePlainDeclaration() ----\n");
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/** Writes the list of members to the output.
Packit 1c1d7e
 *  @param ol Output list to write to
Packit 1c1d7e
 *  @param cd non-null if this list is part of class documentation.
Packit 1c1d7e
 *  @param nd non-null if this list is part of namespace documentation.
Packit 1c1d7e
 *  @param fd non-null if this list is part of file documentation.
Packit 1c1d7e
 *  @param gd non-null if this list is part of group documentation.
Packit 1c1d7e
 *  @param title Title to use for the member list.
Packit 1c1d7e
 *  @param subtitle Sub title to use for the member list.
Packit 1c1d7e
 *  @param showEnumValues Obsolete, always set to FALSE.
Packit 1c1d7e
 *  @param showInline if set to TRUE if title is rendered differently
Packit 1c1d7e
 *  @param inheritedFrom if not 0, the list is shown inside the
Packit 1c1d7e
 *         given class as inherited members, parameter cd points to the
Packit 1c1d7e
 *         class containing the members.
Packit 1c1d7e
 *  @param lt Type of list that is inherited from.
Packit 1c1d7e
 */
Packit 1c1d7e
void MemberList::writeDeclarations(OutputList &ol,
Packit 1c1d7e
             ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
Packit 1c1d7e
             const char *title,const char *subtitle, bool showEnumValues,
Packit 1c1d7e
             bool showInline,ClassDef *inheritedFrom,MemberListType lt)
Packit 1c1d7e
{
Packit 1c1d7e
  (void)showEnumValues; // unused
Packit 1c1d7e
Packit 1c1d7e
  //printf("----- writeDeclaration() this=%p ---- inheritedFrom=%p\n",this,inheritedFrom);
Packit 1c1d7e
  static bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
Packit 1c1d7e
  QCString inheritId;
Packit 1c1d7e
Packit 1c1d7e
  countDecMembers(/*showEnumValues*/FALSE,gd); // count members shown in this section
Packit 1c1d7e
  Definition *ctx = cd;
Packit 1c1d7e
  if (ctx==0 && nd) ctx = nd;
Packit 1c1d7e
  if (ctx==0 && gd) ctx = gd;
Packit 1c1d7e
  if (ctx==0 && fd) ctx = fd;
Packit 1c1d7e
Packit 1c1d7e
  //printf("%p: MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d inheritedFrom=%p\n",
Packit 1c1d7e
  //       this,title,subtitle,numDecMembers(),inheritedFrom);
Packit 1c1d7e
Packit 1c1d7e
  int num = numDecMembers();
Packit 1c1d7e
  if (inheritedFrom)
Packit 1c1d7e
  {
Packit 1c1d7e
    //if ( cd && !optimizeVhdl && countInheritableMembers(inheritedFrom)>0 )
Packit 1c1d7e
    if ( cd && !optimizeVhdl && cd->countMembersIncludingGrouped(
Packit 1c1d7e
                                      m_listType,inheritedFrom,TRUE)>0 )
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.pushGeneratorState();
Packit 1c1d7e
      ol.disableAllBut(OutputGenerator::Html);
Packit 1c1d7e
      inheritId = substitute(listTypeAsString(lt),"-","_")+"_"+
Packit 1c1d7e
                  stripPath(cd->getOutputFileBase());
Packit 1c1d7e
      if (title)
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.writeInheritedSectionTitle(inheritId,cd->getReference(),
Packit 1c1d7e
                                      cd->getOutputFileBase(), 
Packit 1c1d7e
                                      cd->anchor(),title,cd->displayName());
Packit 1c1d7e
      }
Packit 1c1d7e
      ol.popGeneratorState();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (num>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (title) 
Packit 1c1d7e
    {
Packit 1c1d7e
      if (showInline)
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.startInlineHeader();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.startMemberHeader(listTypeAsString(m_listType));
Packit 1c1d7e
      }
Packit 1c1d7e
      ol.parseText(title);
Packit 1c1d7e
      if (showInline)
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.endInlineHeader();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.endMemberHeader();
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    if (subtitle) 
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString st=subtitle;
Packit 1c1d7e
      st = st.stripWhiteSpace();
Packit 1c1d7e
      if (!st.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.startMemberSubtitle();
Packit 1c1d7e
        ol.generateDoc("[generated]",-1,ctx,0,subtitle,FALSE,FALSE,0,FALSE,FALSE);
Packit 1c1d7e
        ol.endMemberSubtitle();
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (num>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    // TODO: Two things need to be worked out for proper VHDL output:
Packit 1c1d7e
    // 1. Signals and types under the group need to be
Packit 1c1d7e
    //    formatted to associate them with the group somehow
Packit 1c1d7e
    //    indentation, or at the very least, extra space after
Packit 1c1d7e
    //    the group is done
Packit 1c1d7e
    // 2. This might need to be repeated below for memberGroupLists
Packit 1c1d7e
    if (optimizeVhdl) // use specific declarations function
Packit 1c1d7e
    {
Packit 1c1d7e
      VhdlDocGen::writeVhdlDeclarations(this,ol,0,cd,0,0);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    //printf("memberGroupList=%p\n",memberGroupList);
Packit 1c1d7e
    if (memberGroupList)
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
      MemberGroup *mg;
Packit 1c1d7e
      while ((mg=mgli.current()))
Packit 1c1d7e
      {
Packit 1c1d7e
        bool hasHeader=!mg->header().isEmpty() && mg->header()!="[NOHEADER]";
Packit 1c1d7e
        if (inheritId.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          //printf("mg->header=%s hasHeader=%d\n",mg->header().data(),hasHeader);
Packit 1c1d7e
          ol.startMemberGroupHeader(hasHeader);
Packit 1c1d7e
          if (hasHeader)
Packit 1c1d7e
          {
Packit 1c1d7e
            ol.parseText(mg->header());
Packit 1c1d7e
          }
Packit 1c1d7e
          ol.endMemberGroupHeader();
Packit 1c1d7e
          if (!mg->documentation().isEmpty())
Packit 1c1d7e
          {
Packit 1c1d7e
            //printf("Member group has docs!\n");
Packit 1c1d7e
            ol.startMemberGroupDocs();
Packit 1c1d7e
            ol.generateDoc(mg->docFile(),mg->docLine(),ctx,0,mg->documentation()+"\n",FALSE,FALSE);
Packit 1c1d7e
            ol.endMemberGroupDocs();
Packit 1c1d7e
          }
Packit 1c1d7e
          ol.startMemberGroup();
Packit 1c1d7e
        }
Packit 1c1d7e
        //printf("--- mg->writePlainDeclarations ---\n");
Packit 1c1d7e
        mg->writePlainDeclarations(ol,cd,nd,fd,gd,inheritedFrom,inheritId);
Packit 1c1d7e
        if (inheritId.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          ol.endMemberGroup(hasHeader);
Packit 1c1d7e
        }
Packit 1c1d7e
        ++mgli;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (inheritedFrom && cd) 
Packit 1c1d7e
  {
Packit 1c1d7e
    // also add members that of this list type, that are grouped together
Packit 1c1d7e
    // in a separate list in class 'inheritedFrom'
Packit 1c1d7e
    cd->addGroupedInheritedMembers(ol,m_listType,inheritedFrom,inheritId);
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("----- end writeDeclaration() ----\n");
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::writeDocumentation(OutputList &ol,
Packit 1c1d7e
                     const char *scopeName, Definition *container,
Packit 1c1d7e
                     const char *title,bool showEnumValues,bool showInline)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("MemberList::writeDocumentation()\n");
Packit 1c1d7e
Packit 1c1d7e
  countDocMembers(showEnumValues);
Packit 1c1d7e
  if (numDocMembers()==0) return;
Packit 1c1d7e
Packit 1c1d7e
  if (title)
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.pushGeneratorState();
Packit 1c1d7e
      ol.disable(OutputGenerator::Html);
Packit 1c1d7e
      ol.writeRuler();
Packit 1c1d7e
    ol.popGeneratorState();
Packit 1c1d7e
    ol.startGroupHeader(showInline ? 2 : 0);
Packit 1c1d7e
    ol.parseText(title);
Packit 1c1d7e
    ol.endGroupHeader(showInline ? 2 : 0);
Packit 1c1d7e
  }
Packit 1c1d7e
  ol.startMemberDocList();
Packit 1c1d7e
Packit 1c1d7e
  MemberListIterator mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
Packit 1c1d7e
  // count the number of overloaded members
Packit 1c1d7e
  QDict<uint> overloadTotalDict(67);
Packit 1c1d7e
  QDict<uint> overloadCountDict(67);
Packit 1c1d7e
  overloadTotalDict.setAutoDelete(TRUE);
Packit 1c1d7e
  overloadCountDict.setAutoDelete(TRUE);
Packit 1c1d7e
  for (mli.toFirst() ; (md=mli.current()) ; ++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isDetailedSectionVisible(m_inGroup,container->definitionType()==Definition::TypeFile) && 
Packit 1c1d7e
        !(md->isEnumValue() && !showInline))
Packit 1c1d7e
    {
Packit 1c1d7e
      uint *pCount = overloadTotalDict.find(md->name());
Packit 1c1d7e
      if (pCount)
Packit 1c1d7e
      {
Packit 1c1d7e
        (*pCount)++;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        overloadTotalDict.insert(md->name(),new uint(1));
Packit 1c1d7e
        overloadCountDict.insert(md->name(),new uint(1));
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  for (mli.toFirst() ; (md=mli.current()) ; ++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isDetailedSectionVisible(m_inGroup,container->definitionType()==Definition::TypeFile) && 
Packit 1c1d7e
        !(md->isEnumValue() && !showInline))
Packit 1c1d7e
    {
Packit 1c1d7e
      uint overloadCount = *overloadTotalDict.find(md->name());
Packit 1c1d7e
      uint *pCount = overloadCountDict.find(md->name());
Packit 1c1d7e
      md->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container,
Packit 1c1d7e
          m_inGroup,showEnumValues,showInline);
Packit 1c1d7e
      (*pCount)++;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (memberGroupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    printf("MemberList::writeDocumentation()  --  member groups %d\n",memberGroupList->count());
Packit 1c1d7e
    MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->writeDocumentation(ol,scopeName,container,showEnumValues,showInline);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  ol.endMemberDocList();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// members in a table
Packit 1c1d7e
void MemberList::writeSimpleDocumentation(OutputList &ol,
Packit 1c1d7e
                     Definition *container)
Packit 1c1d7e
{
Packit 1c1d7e
  countDocMembers(FALSE);
Packit 1c1d7e
  //printf("MemberList count=%d\n",numDocMembers());
Packit 1c1d7e
  if (numDocMembers()==0) return;
Packit 1c1d7e
Packit 1c1d7e
  ClassDef *cd = 0;
Packit 1c1d7e
  if (container && container->definitionType()==Definition::TypeClass)
Packit 1c1d7e
  {
Packit 1c1d7e
    cd = (ClassDef*)container;
Packit 1c1d7e
  }
Packit 1c1d7e
  ol.startMemberDocSimple(cd && cd->isJavaEnum());
Packit 1c1d7e
  MemberListIterator mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for ( ; (md=mli.current()) ; ++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    md->writeMemberDocSimple(ol,container);
Packit 1c1d7e
  }
Packit 1c1d7e
  ol.endMemberDocSimple(cd && cd->isJavaEnum());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// separate member pages
Packit 1c1d7e
void MemberList::writeDocumentationPage(OutputList &ol,
Packit 1c1d7e
                     const char *scopeName, Definition *container)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
Packit 1c1d7e
Packit 1c1d7e
  // count the number of overloaded members
Packit 1c1d7e
  QDict<uint> overloadTotalDict(67);
Packit 1c1d7e
  QDict<uint> overloadCountDict(67);
Packit 1c1d7e
  overloadTotalDict.setAutoDelete(TRUE);
Packit 1c1d7e
  overloadCountDict.setAutoDelete(TRUE);
Packit 1c1d7e
  MemberListIterator mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for (mli.toFirst() ; (md=mli.current()) ; ++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isDetailedSectionLinkable())
Packit 1c1d7e
    {
Packit 1c1d7e
      uint *pCount = overloadTotalDict.find(md->name());
Packit 1c1d7e
      if (pCount)
Packit 1c1d7e
      {
Packit 1c1d7e
        (*pCount)++;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        overloadTotalDict.insert(md->name(),new uint(1));
Packit 1c1d7e
        overloadCountDict.insert(md->name(),new uint(1));
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  for ( mli.toFirst() ; (md=mli.current()) ; ++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isDetailedSectionLinkable())
Packit 1c1d7e
    {
Packit 1c1d7e
      uint overloadCount = *overloadTotalDict.find(md->name());
Packit 1c1d7e
      uint *pCount = overloadCountDict.find(md->name());
Packit 1c1d7e
      QCString diskName=md->getOutputFileBase();
Packit 1c1d7e
      QCString title=md->qualifiedName();
Packit 1c1d7e
      startFile(ol,diskName,md->name(),title,HLI_None,!generateTreeView,diskName);
Packit 1c1d7e
      if (!generateTreeView)
Packit 1c1d7e
      {
Packit 1c1d7e
        container->writeNavigationPath(ol);
Packit 1c1d7e
        ol.endQuickIndices();
Packit 1c1d7e
      }
Packit 1c1d7e
      ol.startContents();
Packit 1c1d7e
Packit 1c1d7e
      if (generateTreeView)
Packit 1c1d7e
      {
Packit 1c1d7e
        md->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container,m_inGroup);
Packit 1c1d7e
        (*pCount)++;
Packit 1c1d7e
        ol.endContents();
Packit 1c1d7e
        endFileWithNavPath(container,ol);
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.writeString("\n"
Packit 1c1d7e
            "  \n"
Packit 1c1d7e
            "   \n");
Packit 1c1d7e
Packit 1c1d7e
        container->writeQuickMemberLinks(ol,md);
Packit 1c1d7e
Packit 1c1d7e
        ol.writeString("   \n");
Packit 1c1d7e
        ol.writeString("   \n");
Packit 1c1d7e
Packit 1c1d7e
        md->writeDocumentation(this,*pCount,overloadCount,ol,scopeName,container,m_inGroup);
Packit 1c1d7e
        (*pCount)++;
Packit 1c1d7e
Packit 1c1d7e
        ol.writeString("    \n");
Packit 1c1d7e
        ol.writeString("  \n");
Packit 1c1d7e
        ol.writeString("\n");
Packit 1c1d7e
Packit 1c1d7e
        endFile(ol);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (memberGroupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("MemberList::writeDocumentation()  --  member groups\n");
Packit 1c1d7e
    MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->writeDocumentationPage(ol,scopeName,container);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::addMemberGroup(MemberGroup *mg)
Packit 1c1d7e
{
Packit 1c1d7e
  if (memberGroupList==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    memberGroupList=new MemberGroupList;
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("addMemberGroup: this=%p mg=%p\n",this,mg);
Packit 1c1d7e
  memberGroupList->append(mg);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::addListReferences(Definition *def)
Packit 1c1d7e
{
Packit 1c1d7e
  MemberListIterator mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for ( ; (md=mli.current()) ; ++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->getGroupDef()==0 || def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
    {
Packit 1c1d7e
      md->addListReference(def);
Packit 1c1d7e
      MemberList *enumFields = md->enumFieldList();
Packit 1c1d7e
      if (md->memberType()==MemberType_Enumeration && enumFields)
Packit 1c1d7e
      {
Packit 1c1d7e
        //printf("  Adding enum values!\n");
Packit 1c1d7e
        MemberListIterator vmli(*enumFields);
Packit 1c1d7e
        MemberDef *vmd;
Packit 1c1d7e
        for ( ; (vmd=vmli.current()) ; ++vmli)
Packit 1c1d7e
        {
Packit 1c1d7e
          //printf("   adding %s\n",vmd->name().data());  
Packit 1c1d7e
          vmd->addListReference(def);
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (memberGroupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->addListReferences(def);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::findSectionsInDocumentation()
Packit 1c1d7e
{
Packit 1c1d7e
  MemberListIterator mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for ( ; (md=mli.current()) ; ++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    md->findSectionsInDocumentation();
Packit 1c1d7e
  }
Packit 1c1d7e
  if (memberGroupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->findSectionsInDocumentation();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::marshal(StorageIntf *s)
Packit 1c1d7e
{
Packit 1c1d7e
  marshalInt(s,(int)m_listType);
Packit 1c1d7e
  marshalInt(s,m_varCnt);
Packit 1c1d7e
  marshalInt(s,m_funcCnt);
Packit 1c1d7e
  marshalInt(s,m_enumCnt);
Packit 1c1d7e
  marshalInt(s,m_enumValCnt);
Packit 1c1d7e
  marshalInt(s,m_typeCnt);
Packit 1c1d7e
  marshalInt(s,m_protoCnt);
Packit 1c1d7e
  marshalInt(s,m_defCnt);
Packit 1c1d7e
  marshalInt(s,m_friendCnt); 
Packit 1c1d7e
  marshalInt(s,m_numDecMembers);
Packit 1c1d7e
  marshalInt(s,m_numDocMembers);
Packit 1c1d7e
  marshalBool(s,m_inGroup);
Packit 1c1d7e
  marshalBool(s,m_inFile);
Packit 1c1d7e
  marshalBool(s,m_needsSorting);
Packit 1c1d7e
  if (memberGroupList==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    marshalUInt(s,NULL_LIST); // null pointer representation
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    marshalUInt(s,memberGroupList->count());
Packit 1c1d7e
    QListIterator<MemberGroup> mgi(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg=0;
Packit 1c1d7e
    for (mgi.toFirst();(mg=mgi.current());++mgi)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->marshal(s);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::unmarshal(StorageIntf *s)
Packit 1c1d7e
{
Packit 1c1d7e
  m_listType       = (MemberListType)unmarshalInt(s);
Packit 1c1d7e
  m_varCnt         = unmarshalInt(s);
Packit 1c1d7e
  m_funcCnt        = unmarshalInt(s);
Packit 1c1d7e
  m_enumCnt        = unmarshalInt(s);
Packit 1c1d7e
  m_enumValCnt     = unmarshalInt(s);
Packit 1c1d7e
  m_typeCnt        = unmarshalInt(s);
Packit 1c1d7e
  m_protoCnt       = unmarshalInt(s);
Packit 1c1d7e
  m_defCnt         = unmarshalInt(s);
Packit 1c1d7e
  m_friendCnt      = unmarshalInt(s); 
Packit 1c1d7e
  m_numDecMembers  = unmarshalInt(s);
Packit 1c1d7e
  m_numDocMembers  = unmarshalInt(s);
Packit 1c1d7e
  m_inGroup        = unmarshalBool(s);
Packit 1c1d7e
  m_inFile         = unmarshalBool(s);
Packit 1c1d7e
  m_needsSorting   = unmarshalBool(s);
Packit 1c1d7e
  uint i,count     = unmarshalUInt(s); 
Packit 1c1d7e
  if (count==NULL_LIST) // empty list
Packit 1c1d7e
  {
Packit 1c1d7e
    memberGroupList = 0;
Packit 1c1d7e
  }
Packit 1c1d7e
  else // add member groups
Packit 1c1d7e
  {
Packit 1c1d7e
    memberGroupList = new MemberGroupList;
Packit 1c1d7e
    for (i=0;i
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberGroup *mg = new MemberGroup;
Packit 1c1d7e
      mg->unmarshal(s);
Packit 1c1d7e
      memberGroupList->append(mg);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::setNeedsSorting(bool b)
Packit 1c1d7e
{
Packit 1c1d7e
  m_needsSorting = b;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QCString MemberList::listTypeAsString(MemberListType type) 
Packit 1c1d7e
{
Packit 1c1d7e
  switch(type)
Packit 1c1d7e
  {
Packit 1c1d7e
    case MemberListType_pubMethods: return "pub-methods";
Packit 1c1d7e
    case MemberListType_proMethods: return "pro-methods";
Packit 1c1d7e
    case MemberListType_pacMethods: return "pac-methods";
Packit 1c1d7e
    case MemberListType_priMethods: return "pri-methods";
Packit 1c1d7e
    case MemberListType_pubStaticMethods: return "pub-static-methods";
Packit 1c1d7e
    case MemberListType_proStaticMethods: return "pro-static-methods";
Packit 1c1d7e
    case MemberListType_pacStaticMethods: return "pac-static-methods";
Packit 1c1d7e
    case MemberListType_priStaticMethods: return "pri-static-methods";
Packit 1c1d7e
    case MemberListType_pubSlots: return "pub-slots";
Packit 1c1d7e
    case MemberListType_proSlots: return "pro-slots";
Packit 1c1d7e
    case MemberListType_priSlots: return "pri-slots";
Packit 1c1d7e
    case MemberListType_pubAttribs: return "pub-attribs";
Packit 1c1d7e
    case MemberListType_proAttribs: return "pro-attribs";
Packit 1c1d7e
    case MemberListType_pacAttribs: return "pac-attribs";
Packit 1c1d7e
    case MemberListType_priAttribs: return "pri-attribs";
Packit 1c1d7e
    case MemberListType_pubStaticAttribs: return "pub-static-attribs";
Packit 1c1d7e
    case MemberListType_proStaticAttribs: return "pro-static-attribs";
Packit 1c1d7e
    case MemberListType_pacStaticAttribs: return "pac-static-attribs";
Packit 1c1d7e
    case MemberListType_priStaticAttribs: return "pri-static-attribs";
Packit 1c1d7e
    case MemberListType_pubTypes: return "pub-types";
Packit 1c1d7e
    case MemberListType_proTypes: return "pro-types";
Packit 1c1d7e
    case MemberListType_pacTypes: return "pac-types";
Packit 1c1d7e
    case MemberListType_priTypes: return "pri-types";
Packit 1c1d7e
    case MemberListType_related: return "related";
Packit 1c1d7e
    case MemberListType_signals: return "signals";
Packit 1c1d7e
    case MemberListType_friends: return "friends";
Packit 1c1d7e
    case MemberListType_dcopMethods: return "dcop-methods";
Packit 1c1d7e
    case MemberListType_properties: return "properties";
Packit 1c1d7e
    case MemberListType_events: return "events";
Packit 1c1d7e
    case MemberListType_interfaces: return "interfaces";
Packit 1c1d7e
    case MemberListType_services: return "services";
Packit 1c1d7e
    case MemberListType_decDefineMembers: return "define-members";
Packit 1c1d7e
    case MemberListType_decProtoMembers: return "proto-members";
Packit 1c1d7e
    case MemberListType_decTypedefMembers: return "typedef-members";
Packit 1c1d7e
    case MemberListType_decEnumMembers: return "enum-members";
Packit 1c1d7e
    case MemberListType_decFuncMembers: return "func-members";
Packit 1c1d7e
    case MemberListType_decVarMembers: return "var-members";
Packit 1c1d7e
    case MemberListType_decEnumValMembers: return "enumval-members";
Packit 1c1d7e
    case MemberListType_decPubSlotMembers: return "pub-slot-members";
Packit 1c1d7e
    case MemberListType_decProSlotMembers: return "pro-slot-members";
Packit 1c1d7e
    case MemberListType_decPriSlotMembers: return "pri-slot-members";
Packit 1c1d7e
    case MemberListType_decSignalMembers: return "signal-members";
Packit 1c1d7e
    case MemberListType_decEventMembers: return "event-members";
Packit 1c1d7e
    case MemberListType_decFriendMembers: return "friend-members";
Packit 1c1d7e
    case MemberListType_decPropMembers: return "prop-members";
Packit 1c1d7e
    case MemberListType_enumFields: return "enum-fields";
Packit 1c1d7e
    case MemberListType_memberGroup: return "member-group";
Packit 1c1d7e
    default: break;
Packit 1c1d7e
  }
Packit 1c1d7e
  return "";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MemberList::writeTagFile(FTextStream &tagFile)
Packit 1c1d7e
{
Packit 1c1d7e
  MemberListIterator mli(*this);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for ( ; (md=mli.current()) ; ++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->getLanguage()!=SrcLangExt_VHDL)
Packit 1c1d7e
    {
Packit 1c1d7e
      md->writeTagFile(tagFile);
Packit 1c1d7e
      if (md->memberType()==MemberType_Enumeration && md->enumFieldList() && !md->isStrong())
Packit 1c1d7e
      {
Packit 1c1d7e
        MemberListIterator vmli(*md->enumFieldList());
Packit 1c1d7e
        MemberDef *vmd;
Packit 1c1d7e
        for ( ; (vmd=vmli.current()) ; ++vmli)
Packit 1c1d7e
        {
Packit 1c1d7e
          vmd->writeTagFile(tagFile);
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      VhdlDocGen::writeTagFile(md,tagFile);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (memberGroupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupListIterator mgli(*memberGroupList);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->writeTagFile(tagFile);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//--------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
int MemberSDict::compareValues(const MemberDef *c1, const MemberDef *c2) const
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("MemberSDict::compareValues(%s,%s)\n",c1->name().data(),c2->name().data());
Packit 1c1d7e
  int cmp = qstricmp(c1->name(),c2->name());
Packit 1c1d7e
  if (cmp)
Packit 1c1d7e
  {
Packit 1c1d7e
    return cmp;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    return c1->getDefLine()-c2->getDefLine();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e