1 /******************************************************************************
3 * $Id: namespacedef.cpp,v 1.27 2001/03/19 19:27:41 root Exp $
5 * Copyright (C) 1997-2012 by Dimitri van Heesch.
7 * Permission to use, copy, modify, and distribute this software and its
8 * documentation under the terms of the GNU General Public License is hereby
9 * granted. No representations are made about the suitability of this software
10 * for any purpose. It is provided "as is" without express or implied warranty.
11 * See the GNU General Public License for more details.
13 * Documents produced by Doxygen are derivative works derived from the
14 * input used in their production; they are not affected by this license.
19 #include "namespacedef.h"
20 #include "outputlist.h"
24 #include "classlist.h"
25 #include "memberlist.h"
28 #include "docparser.h"
29 #include "searchindex.h"
30 #include "vhdldocgen.h"
33 //------------------------------------------------------------------
35 NamespaceDef::NamespaceDef(const char *df,int dl,
36 const char *name,const char *lref,
38 Definition(df,dl,name)
42 fileName = stripExtension(fName);
49 classSDict = new ClassSDict(17);
50 namespaceSDict = new NamespaceSDict(17);
51 m_innerCompounds = new SDict<Definition>(17);
56 memberGroupSDict = new MemberGroupSDict;
57 memberGroupSDict->setAutoDelete(TRUE);
59 m_subGrouping=Config_getBool("SUBGROUPING");
62 NamespaceDef::~NamespaceDef()
65 delete namespaceSDict;
66 delete m_innerCompounds;
69 delete memberGroupSDict;
72 void NamespaceDef::distributeMemberGroupDocumentation()
74 MemberGroupSDict::Iterator mgli(*memberGroupSDict);
76 for (;(mg=mgli.current());++mgli)
78 mg->distributeMemberGroupDocumentation();
82 void NamespaceDef::findSectionsInDocumentation()
84 docFindSections(documentation(),this,0,docFile());
85 MemberGroupSDict::Iterator mgli(*memberGroupSDict);
87 for (;(mg=mgli.current());++mgli)
89 mg->findSectionsInDocumentation();
91 QListIterator<MemberList> mli(m_memberLists);
93 for (mli.toFirst();(ml=mli.current());++mli)
95 if (ml->listType()&MemberList::declarationLists)
97 ml->findSectionsInDocumentation();
102 void NamespaceDef::insertUsedFile(const char *f)
104 if (files.find(f)==-1)
106 if (Config_getBool("SORT_MEMBER_DOCS"))
113 void NamespaceDef::addInnerCompound(Definition *d)
115 m_innerCompounds->append(d->localName(),d);
116 if (d->definitionType()==Definition::TypeNamespace)
118 insertNamespace((NamespaceDef *)d);
120 else if (d->definitionType()==Definition::TypeClass)
122 insertClass((ClassDef *)d);
126 void NamespaceDef::insertClass(ClassDef *cd)
128 if (classSDict->find(cd->name())==0)
130 if (Config_getBool("SORT_BRIEF_DOCS"))
131 classSDict->inSort(cd->name(),cd);
133 classSDict->append(cd->name(),cd);
137 void NamespaceDef::insertNamespace(NamespaceDef *nd)
139 if (namespaceSDict->find(nd->name())==0)
141 if (Config_getBool("SORT_MEMBER_DOCS"))
142 namespaceSDict->inSort(nd->name(),nd);
144 namespaceSDict->append(nd->name(),nd);
149 void NamespaceDef::addMembersToMemberGroup()
151 QListIterator<MemberList> mli(m_memberLists);
153 for (mli.toFirst();(ml=mli.current());++mli)
155 if (ml->listType()&MemberList::declarationLists)
157 ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
161 // add members inside sections to their groups
162 if (memberGroupSDict)
164 MemberGroupSDict::Iterator mgli(*memberGroupSDict);
166 for (;(mg=mgli.current());++mgli)
168 if (mg->allMembersInSameSection() && m_subGrouping)
170 //printf("----> addToDeclarationSection(%s)\n",mg->header().data());
171 mg->addToDeclarationSection();
177 void NamespaceDef::insertMember(MemberDef *md)
179 if (md->isHidden()) return;
180 MemberList *allMemberList = getMemberList(MemberList::allMembersList);
181 if (allMemberList==0)
183 allMemberList = new MemberList(MemberList::allMembersList);
184 m_memberLists.append(allMemberList);
186 allMemberList->append(md);
187 if (m_allMembersDict==0)
189 m_allMembersDict = new MemberSDict;
191 //printf("%s::m_allMembersDict->append(%s)\n",name().data(),md->localName().data());
192 m_allMembersDict->append(md->localName(),md);
193 //::addNamespaceMemberNameToIndex(md);
194 //static bool sortBriefDocs=Config_getBool("SORT_BRIEF_DOCS");
195 switch(md->memberType())
197 case MemberDef::Variable:
198 addMemberToList(MemberList::decVarMembers,md);
199 addMemberToList(MemberList::docVarMembers,md);
201 case MemberDef::Function:
202 addMemberToList(MemberList::decFuncMembers,md);
203 addMemberToList(MemberList::docFuncMembers,md);
205 case MemberDef::Typedef:
206 addMemberToList(MemberList::decTypedefMembers,md);
207 addMemberToList(MemberList::docTypedefMembers,md);
209 case MemberDef::Enumeration:
210 addMemberToList(MemberList::decEnumMembers,md);
211 addMemberToList(MemberList::docEnumMembers,md);
213 case MemberDef::EnumValue:
215 case MemberDef::Define:
216 addMemberToList(MemberList::decDefineMembers,md);
217 addMemberToList(MemberList::docDefineMembers,md);
220 err("NamespaceDef::insertMembers(): "
221 "member `%s' with class scope `%s' inserted in namespace scope `%s'!\n",
223 md->getClassDef() ? md->getClassDef()->name().data() : "",
228 void NamespaceDef::computeAnchors()
230 MemberList *allMemberList = getMemberList(MemberList::allMembersList);
231 if (allMemberList) setAnchors(0,'a',allMemberList);
234 void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title)
236 if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
237 !documentation().isEmpty()
240 ol.pushGeneratorState();
241 ol.disable(OutputGenerator::Html);
243 ol.popGeneratorState();
244 ol.pushGeneratorState();
245 ol.disableAllBut(OutputGenerator::Html);
246 ol.writeAnchor(0,"details");
247 ol.popGeneratorState();
248 ol.startGroupHeader();
253 if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
255 ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
257 if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
258 !documentation().isEmpty())
260 ol.pushGeneratorState();
261 ol.disable(OutputGenerator::Man);
262 ol.disable(OutputGenerator::RTF);
263 //ol.newParagraph(); // FIXME:PARA
265 ol.disableAllBut(OutputGenerator::Man);
266 ol.writeString("\n\n");
267 ol.popGeneratorState();
269 if (!documentation().isEmpty())
271 ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
277 void NamespaceDef::writeBriefDescription(OutputList &ol)
279 if (!briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
282 ol.parseDoc(briefFile(),briefLine(),this,0,
283 briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
284 ol.pushGeneratorState();
285 ol.disable(OutputGenerator::RTF);
286 ol.writeString(" \n");
287 ol.enable(OutputGenerator::RTF);
289 if (Config_getBool("REPEAT_BRIEF") ||
290 !documentation().isEmpty()
293 ol.disableAllBut(OutputGenerator::Html);
294 ol.startTextLink(0,"details");
295 ol.parseText(theTranslator->trMore());
298 ol.popGeneratorState();
302 //ol.pushGeneratorState();
303 //ol.disable(OutputGenerator::RTF);
305 //ol.popGeneratorState();
310 void NamespaceDef::startMemberDeclarations(OutputList &ol)
312 ol.startMemberSections();
315 void NamespaceDef::endMemberDeclarations(OutputList &ol)
317 ol.endMemberSections();
320 void NamespaceDef::startMemberDocumentation(OutputList &ol)
322 if (Config_getBool("SEPARATE_MEMBER_PAGES"))
324 ol.disable(OutputGenerator::Html);
325 Doxygen::suppressDocWarnings = TRUE;
329 void NamespaceDef::endMemberDocumentation(OutputList &ol)
331 if (Config_getBool("SEPARATE_MEMBER_PAGES"))
333 ol.enable(OutputGenerator::Html);
334 Doxygen::suppressDocWarnings = FALSE;
338 void NamespaceDef::writeClassDeclarations(OutputList &ol,const QCString &title)
340 if (classSDict) classSDict->writeDeclaration(ol,0,title,TRUE);
343 void NamespaceDef::writeInlineClasses(OutputList &ol)
345 if (classSDict) classSDict->writeDocumentation(ol,this);
348 void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)
350 if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,TRUE);
353 void NamespaceDef::writeMemberGroups(OutputList &ol)
355 /* write user defined member groups */
356 if (memberGroupSDict)
358 memberGroupSDict->sort();
359 MemberGroupSDict::Iterator mgli(*memberGroupSDict);
361 for (;(mg=mgli.current());++mgli)
363 if ((!mg->allMembersInSameSection() || !m_subGrouping)
364 && mg->header()!="[NOHEADER]")
366 mg->writeDeclarations(ol,0,this,0,0);
372 void NamespaceDef::writeAuthorSection(OutputList &ol)
374 // write Author section (Man only)
375 ol.pushGeneratorState();
376 ol.disableAllBut(OutputGenerator::Man);
377 ol.startGroupHeader();
378 ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
380 ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
381 ol.popGeneratorState();
384 void NamespaceDef::writeSummaryLinks(OutputList &ol)
386 ol.pushGeneratorState();
387 ol.disableAllBut(OutputGenerator::Html);
388 QListIterator<LayoutDocEntry> eli(
389 LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));
392 SrcLangExt lang = getLanguage();
393 for (eli.toFirst();(lde=eli.current());++eli)
395 if ((lde->kind()==LayoutDocEntry::NamespaceClasses && classSDict && classSDict->declVisible()) ||
396 (lde->kind()==LayoutDocEntry::NamespaceNestedNamespaces && namespaceSDict && namespaceSDict->declVisible())
399 LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
400 QCString label = lde->kind()==LayoutDocEntry::NamespaceClasses ? "nested-classes" : "namespaces";
401 ol.writeSummaryLink(0,label,ls->title(lang),first);
404 else if (lde->kind()== LayoutDocEntry::MemberDecl)
406 LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
407 MemberList * ml = getMemberList(lmd->type);
408 if (ml && ml->declVisible())
410 ol.writeSummaryLink(0,ml->listTypeAsString(),lmd->title(lang),first);
417 ol.writeString(" </div>\n");
419 ol.popGeneratorState();
422 void NamespaceDef::writeDocumentation(OutputList &ol)
424 static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
425 //static bool outputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
426 //static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
427 SrcLangExt lang = getLanguage();
430 if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
432 pageTitle = theTranslator->trPackage(displayName());
434 else if (lang==SrcLangExt_Fortran)
436 pageTitle = theTranslator->trModuleReference(displayName());
440 pageTitle = theTranslator->trNamespaceReference(displayName());
442 startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_NamespaceVisible,!generateTreeView);
444 if (!generateTreeView)
446 if (getOuterScope()!=Doxygen::globalScope)
448 writeNavigationPath(ol);
450 ol.endQuickIndices();
453 startTitle(ol,getOutputFileBase(),this);
454 ol.parseText(pageTitle);
455 addGroupListToTitle(ol,this);
456 endTitle(ol,getOutputFileBase(),displayName());
459 if (Doxygen::searchIndex)
461 Doxygen::searchIndex->setCurrentDoc(this,anchor(),FALSE);
462 Doxygen::searchIndex->addWord(localName(),TRUE);
465 bool generateTagFile = !Config_getString("GENERATE_TAGFILE").isEmpty();
468 Doxygen::tagFile << " <compound kind=\"namespace\">" << endl;
469 Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
470 Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
473 Doxygen::indexList.addIndexItem(this,0);
475 //---------------------------------------- start flexible part -------------------------------
477 QListIterator<LayoutDocEntry> eli(
478 LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));
480 for (eli.toFirst();(lde=eli.current());++eli)
484 case LayoutDocEntry::BriefDesc:
485 writeBriefDescription(ol);
487 case LayoutDocEntry::MemberDeclStart:
488 startMemberDeclarations(ol);
490 case LayoutDocEntry::NamespaceClasses:
492 LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
493 writeClassDeclarations(ol,ls->title(lang));
496 case LayoutDocEntry::NamespaceNestedNamespaces:
498 LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
499 writeNamespaceDeclarations(ol,ls->title(lang));
502 case LayoutDocEntry::MemberGroups:
503 writeMemberGroups(ol);
505 case LayoutDocEntry::MemberDecl:
507 LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
508 writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
511 case LayoutDocEntry::MemberDeclEnd:
512 endMemberDeclarations(ol);
514 case LayoutDocEntry::DetailedDesc:
516 LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
517 writeDetailedDescription(ol,ls->title(lang));
520 case LayoutDocEntry::MemberDefStart:
521 startMemberDocumentation(ol);
523 case LayoutDocEntry::NamespaceInlineClasses:
524 writeInlineClasses(ol);
526 case LayoutDocEntry::MemberDef:
528 LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
529 writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
532 case LayoutDocEntry::MemberDefEnd:
533 endMemberDocumentation(ol);
535 case LayoutDocEntry::AuthorSection:
536 writeAuthorSection(ol);
538 case LayoutDocEntry::ClassIncludes:
539 case LayoutDocEntry::ClassInheritanceGraph:
540 case LayoutDocEntry::ClassNestedClasses:
541 case LayoutDocEntry::ClassCollaborationGraph:
542 case LayoutDocEntry::ClassAllMembersLink:
543 case LayoutDocEntry::ClassUsedFiles:
544 case LayoutDocEntry::ClassInlineClasses:
545 case LayoutDocEntry::FileClasses:
546 case LayoutDocEntry::FileNamespaces:
547 case LayoutDocEntry::FileIncludes:
548 case LayoutDocEntry::FileIncludeGraph:
549 case LayoutDocEntry::FileIncludedByGraph:
550 case LayoutDocEntry::FileSourceLink:
551 case LayoutDocEntry::FileInlineClasses:
552 case LayoutDocEntry::GroupClasses:
553 case LayoutDocEntry::GroupInlineClasses:
554 case LayoutDocEntry::GroupNamespaces:
555 case LayoutDocEntry::GroupDirs:
556 case LayoutDocEntry::GroupNestedGroups:
557 case LayoutDocEntry::GroupFiles:
558 case LayoutDocEntry::GroupGraph:
559 case LayoutDocEntry::GroupPageDocs:
560 case LayoutDocEntry::DirSubDirs:
561 case LayoutDocEntry::DirFiles:
562 case LayoutDocEntry::DirGraph:
563 err("Internal inconsistency: member %d should not be part of "
564 "LayoutDocManager::Namespace entry list\n",lde->kind());
569 //---------------------------------------- end flexible part -------------------------------
573 endFileWithNavPath(this,ol);
577 writeDocAnchorsToTagFile();
578 Doxygen::tagFile << " </compound>" << endl;
581 if (Config_getBool("SEPARATE_MEMBER_PAGES"))
583 MemberList *allMemberList = getMemberList(MemberList::allMembersList);
584 if (allMemberList) allMemberList->sort();
585 writeMemberPages(ol);
589 void NamespaceDef::writeMemberPages(OutputList &ol)
591 ol.pushGeneratorState();
592 ol.disableAllBut(OutputGenerator::Html);
594 QListIterator<MemberList> mli(m_memberLists);
596 for (mli.toFirst();(ml=mli.current());++mli)
598 if (ml->listType()&MemberList::documentationLists)
600 ml->writeDocumentationPage(ol,displayName(),this);
603 ol.popGeneratorState();
606 void NamespaceDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
608 static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
610 ol.writeString(" <div class=\"navtab\">\n");
611 ol.writeString(" <table>\n");
613 MemberList *allMemberList = getMemberList(MemberList::allMembersList);
616 MemberListIterator mli(*allMemberList);
618 for (mli.toFirst();(md=mli.current());++mli)
620 if (md->getNamespaceDef()==this && md->isLinkable())
622 ol.writeString(" <tr><td class=\"navtab\">");
623 if (md->isLinkableInProject())
625 if (md==currentMd) // selected item => highlight
627 ol.writeString("<a class=\"qindexHL\" ");
631 ol.writeString("<a class=\"qindex\" ");
633 ol.writeString("href=\"");
634 if (createSubDirs) ol.writeString("../../");
635 ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
636 ol.writeString("\">");
637 ol.writeString(convertToHtml(md->localName()));
638 ol.writeString("</a>");
640 ol.writeString("</td></tr>\n");
645 ol.writeString(" </table>\n");
646 ol.writeString(" </div>\n");
649 int NamespaceDef::countMembers()
651 MemberList *allMemberList = getMemberList(MemberList::allMembersList);
652 if (allMemberList) allMemberList->countDocMembers();
653 return (allMemberList ? allMemberList->numDocMembers() : 0)+classSDict->count();
656 void NamespaceDef::addUsingDirective(NamespaceDef *nd)
660 usingDirList = new NamespaceSDict;
662 if (usingDirList->find(nd->qualifiedName())==0)
664 usingDirList->append(nd->qualifiedName(),nd);
666 //printf("%p: NamespaceDef::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count());
669 NamespaceSDict *NamespaceDef::getUsedNamespaces() const
671 //printf("%p: NamespaceDef::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0);
675 void NamespaceDef::addUsingDeclaration(Definition *d)
677 if (usingDeclList==0)
679 usingDeclList = new SDict<Definition>(17);
681 if (usingDeclList->find(d->qualifiedName())==0)
683 usingDeclList->append(d->qualifiedName(),d);
687 QCString NamespaceDef::getOutputFileBase() const
695 return convertNameToFile(fileName);
699 Definition *NamespaceDef::findInnerCompound(const char *n)
702 Definition *d = m_innerCompounds->find(n);
707 d = usingDirList->find(n);
709 if (d==0 && usingDeclList)
711 d = usingDeclList->find(n);
717 void NamespaceDef::addListReferences()
719 //bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
721 LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();
722 addRefItem(xrefItems.pointer(),
724 getLanguage()==SrcLangExt_Fortran ?
725 theTranslator->trModule(TRUE,TRUE) :
726 theTranslator->trNamespace(TRUE,TRUE),
727 getOutputFileBase(),displayName(),
731 MemberGroupSDict::Iterator mgli(*memberGroupSDict);
733 for (;(mg=mgli.current());++mgli)
735 mg->addListReferences(this);
737 QListIterator<MemberList> mli(m_memberLists);
739 for (mli.toFirst();(ml=mli.current());++mli)
741 if (ml->listType()&MemberList::documentationLists)
743 ml->addListReferences(this);
748 QCString NamespaceDef::displayName(bool includeScope) const
750 QCString result=includeScope ? name() : localName();
751 SrcLangExt lang = getLanguage();
752 QCString sep = getLanguageSpecificSeparator(lang);
755 result = substitute(result,"::",sep);
757 //printf("NamespaceDef::displayName() %s->%s lang=%d\n",name().data(),result.data(),lang);
761 QCString NamespaceDef::localName() const
763 QCString result=name();
764 int i=result.findRev("::");
767 result=result.mid(i+2);
772 void NamespaceDef::combineUsingRelations()
774 if (visited) return; // already done
778 NamespaceSDict::Iterator nli(*usingDirList);
780 for (nli.toFirst();(nd=nli.current());++nli)
782 nd->combineUsingRelations();
784 for (nli.toFirst();(nd=nli.current());++nli)
786 // add used namespaces of namespace nd to this namespace
787 if (nd->getUsedNamespaces())
789 NamespaceSDict::Iterator unli(*nd->getUsedNamespaces());
791 for (unli.toFirst();(und=unli.current());++unli)
793 //printf("Adding namespace %s to the using list of %s\n",und->qualifiedName().data(),qualifiedName().data());
794 addUsingDirective(und);
797 // add used classes of namespace nd to this namespace
798 if (nd->getUsedClasses())
800 SDict<Definition>::Iterator cli(*nd->getUsedClasses());
802 for (cli.toFirst();(ucd=cli.current());++cli)
804 //printf("Adding class %s to the using list of %s\n",cd->qualifiedName().data(),qualifiedName().data());
805 addUsingDeclaration(ucd);
812 bool NamespaceSDict::declVisible() const
814 SDict<NamespaceDef>::Iterator ni(*this);
816 for (ni.toFirst();(nd=ni.current());++ni)
818 if (nd->isLinkable())
826 void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool localName)
830 if (count()==0) return; // no namespaces in the list
832 if (Config_getBool("OPTIMIZE_OUTPUT_VHDL")) return;
835 SDict<NamespaceDef>::Iterator ni(*this);
838 for (ni.toFirst();(nd=ni.current()) && !found;++ni)
840 if (nd->isLinkable()) found=TRUE;
842 if (!found) return; // no linkable namespaces in the list
844 // write list of namespaces
845 ol.startMemberHeader("namespaces");
846 //bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
847 //bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
849 ol.endMemberHeader();
850 ol.startMemberList();
851 for (ni.toFirst();(nd=ni.current());++ni)
853 if (nd->isLinkable())
855 SrcLangExt lang = nd->getLanguage();
856 ol.startMemberDeclaration();
857 ol.startMemberItem(nd->getOutputFileBase(),0);
858 if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
860 ol.docify("package ");
862 else if (lang==SrcLangExt_Fortran)
864 ol.docify("module ");
868 ol.docify("namespace ");
870 ol.insertMemberAlign();
874 name = nd->localName();
878 name = nd->displayName();
880 ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),0,name);
881 if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !nd->isReference())
883 Doxygen::tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
886 if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
888 ol.startMemberDescription(nd->getOutputFileBase());
889 ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE,0,TRUE);
890 ol.endMemberDescription();
892 ol.endMemberDeclaration(0,0);
898 MemberList *NamespaceDef::createMemberList(MemberList::ListType lt)
900 m_memberLists.setAutoDelete(TRUE);
901 QListIterator<MemberList> mli(m_memberLists);
903 for (mli.toFirst();(ml=mli.current());++mli)
905 if (ml->listType()==lt)
910 // not found, create a new member list
911 ml = new MemberList(lt);
912 m_memberLists.append(ml);
916 void NamespaceDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
918 static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
919 static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
920 MemberList *ml = createMemberList(lt);
922 ((ml->listType()&MemberList::declarationLists) && sortBriefDocs) ||
923 ((ml->listType()&MemberList::documentationLists) && sortMemberDocs));
927 if (ml->needsSorting())
933 if (ml->listType()&MemberList::declarationLists) md->setSectionList(this,ml);
936 void NamespaceDef::sortMemberLists()
938 MemberList *ml = m_memberLists.first();
941 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
942 ml = m_memberLists.next();
948 MemberList *NamespaceDef::getMemberList(MemberList::ListType lt) const
950 NamespaceDef *that = (NamespaceDef*)this;
951 MemberList *ml = that->m_memberLists.first();
954 if (ml->listType()==lt)
958 ml = that->m_memberLists.next();
963 void NamespaceDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title)
965 MemberList * ml = getMemberList(lt);
966 if (ml) ml->writeDeclarations(ol,0,this,0,0,title,0);
969 void NamespaceDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title)
971 MemberList * ml = getMemberList(lt);
972 if (ml) ml->writeDocumentation(ol,displayName(),this,title);
976 bool NamespaceDef::isLinkableInProject() const
978 int i = name().findRev("::");
979 if (i==-1) i=0; else i+=2;
980 static bool extractAnonNs = Config_getBool("EXTRACT_ANON_NSPACES");
981 if (extractAnonNs && // extract anonymous ns
982 name().mid(i,20)=="anonymous_namespace{" // correct prefix
983 ) // not disabled by config
987 return !name().isEmpty() && name().at(i)!='@' && // not anonymous
988 (hasDocumentation() || getLanguage()==SrcLangExt_CSharp) && // documented
989 !isReference() && // not an external reference
990 !isHidden() && // not hidden
991 !isArtificial(); // or artificial
994 bool NamespaceDef::isLinkable() const
996 return isLinkableInProject() || isReference();
999 MemberDef * NamespaceDef::getMemberByName(const QCString &n) const
1002 if (m_allMembersDict && !n.isEmpty())
1004 md = m_allMembersDict->find(n);
1005 //printf("%s::m_allMembersDict->find(%s)=%p\n",name().data(),n.data(),md);