Doxygen
Loading...
Searching...
No Matches
memberlist.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 *
4 *
5 * Copyright (C) 1997-2015 by Dimitri van Heesch.
6 *
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.
12 *
13 * Documents produced by Doxygen are derivative works derived from the
14 * input used in their production; they are not affected by this license.
15 *
16 */
17
18#include "memberlist.h"
19#include "classdef.h"
20#include "message.h"
21#include "util.h"
22#include "language.h"
23#include "doxygen.h"
24#include "outputlist.h"
25#include "groupdef.h"
26#include "vhdldocgen.h"
27#include "namespacedef.h"
28#include "filedef.h"
29#include "membergroup.h"
30#include "config.h"
31#include "docparser.h"
32#include "moduledef.h"
33
35{
36 //printf("%p: MemberList::MemberList(%d)\n",this,lt);
37 m_numDecMembers=-1; // special value indicating that value needs to be computed
39 m_numDocMembers=-1; // special value indicating that value needs to be computed
42}
43
47
49{
50 bool sortConstructorsFirst = Config_getBool(SORT_MEMBERS_CTORS_1ST);
51 if (sortConstructorsFirst)
52 {
53 int ord1 = c1->isConstructor() ? 2 : (c1->isDestructor() ? 1 : 0);
54 int ord2 = c2->isConstructor() ? 2 : (c2->isDestructor() ? 1 : 0);
55 if (ord1 > ord2)
56 return -1;
57 else if (ord2 > ord1)
58 return 1;
59 }
60 // sort on name, first case in-sensitive
61 int cmp = qstricmp_sort(c1->name(),c2->name());
62 // then on qualified name
63 if (cmp==0)
64 {
65 cmp = qstricmp_sort(c1->qualifiedName(),c2->qualifiedName());
66 }
67 // then on argument list
68 if (cmp==0 && !c1->argsString().isEmpty() && !c2->argsString().isEmpty())
69 {
70 cmp = qstricmp_sort(c1->argsString(),c2->argsString());
71 }
72 // then on file in which the item is defined
73 if (cmp==0)
74 {
76 }
77 // then on line number at which the member is defined
78 if (cmp==0)
79 {
80 cmp = c1->getDefLine()-c2->getDefLine();
81 }
82 return cmp;
83}
84
85int MemberList::countInheritableMembers(const ClassDef *inheritedFrom) const
86{
87 int count=0;
88 for (const auto &md : m_members)
89 {
90 if (md->isBriefSectionVisible())
91 {
92 if (md->memberType()!=MemberType::Friend &&
93 md->memberType()!=MemberType::EnumValue)
94 {
95 //printf("member %s: isReimplementedBy(%s)=%d\n",qPrint(md->name()),
96 // qPrint(inheritedFrom->name()),
97 // md->isReimplementedBy(inheritedFrom));
98 if (md->memberType()==MemberType::Function)
99 {
100 if (!md->isReimplementedBy(inheritedFrom)) count++;
101 }
102 else
103 {
104 count++;
105 }
106 }
107 }
108 }
109 for (const auto &mg : m_memberGroupRefList)
110 {
111 count+=mg->countInheritableMembers(inheritedFrom);
112 }
113 //printf("%s::countInheritableMembers(%s)=%d\n",
114 // qPrint(m_listType.toLabel()),
115 // qPrint(inheritedFrom->name()),count);
116 return count;
117}
118
119/*! Count the number of members in this list that are visible in
120 * the declaration part of a compound's documentation page.
121 */
123{
124 if (m_numDecMembers!=-1) return;
125
126 //printf("----- countDecMembers count=%d ----\n",count());
127 /*
128 m_varCnt=m_funcCnt=m_enumCnt=m_enumValCnt=0;
129 m_typeCnt=m_seqCnt=m_dictCnt=m_protoCnt=m_defCnt=m_friendCnt=0;
130 */
132 for (const auto &md : m_members)
133 {
134 //printf("MemberList::countDecMembers(md=%s,%d)\n",qPrint(md->name()),md->isBriefSectionVisible());
135 if (md->isBriefSectionVisible())
136 {
137 switch(md->memberType())
138 {
139 case MemberType::Variable: // fall through
140 case MemberType::Event: // fall through
141 case MemberType::Property: /*m_varCnt++,*/
143 break;
144// apparently necessary to get this to show up in declarations section?
145 case MemberType::Interface: // fall through
146 case MemberType::Service: // fall through
147 case MemberType::Function: // fall through
148 case MemberType::Signal: // fall through
149 case MemberType::DCOP: // fall through
150 case MemberType::Slot: if (!md->isRelated() || md->getClassDef())
151 /*m_funcCnt++,*/
153 break;
154 case MemberType::Enumeration: /*m_enumCnt++,*/
156 break;
159 break;
160 case MemberType::Typedef: /*m_typeCnt++,*/
162 break;
163 case MemberType::Sequence: /*m_seqCnt++,*/
165 break;
166 case MemberType::Dictionary: /*m_dictCnt++,*/
168 break;
169 //case MemberType::Prototype: m_protoCnt++,m_numDecMembers++; break;
170 case MemberType::Define: if (Config_getBool(EXTRACT_ALL) ||
171 !md->argsString().isEmpty() ||
172 !md->initializer().isEmpty() ||
173 md->hasDocumentation()
174 ) /*m_defCnt++,*/ m_numDecMembers++;
175 break;
176 case MemberType::Friend: /*m_friendCnt++,*/
178 break;
179 default:
180 err("Unknown member type found for member '%s'!\n",qPrint(md->name()));
181 }
182 }
183 }
184 for (const auto &mg : m_memberGroupRefList)
185 {
186 mg->countDecMembers();
187 /*
188 m_varCnt+=mg->varCount();
189 m_funcCnt+=mg->funcCount();
190 m_enumCnt+=mg->enumCount();
191 m_enumValCnt+=mg->enumValueCount();
192 m_typeCnt+=mg->typedefCount();
193 m_seqCnt+=mg->sequenceCount();
194 m_dictCnt+=mg->dictionaryCount();
195 m_protoCnt+=mg->protoCount();
196 m_defCnt+=mg->defineCount();
197 m_friendCnt+=mg->friendCount();
198 */
199 m_numDecMembers+=mg->numDecMembers();
200 m_numDecEnumValues+=mg->numDecEnumValues();
201 }
202 //printf("----- end countDecMembers ----\n");
203
204 //printf("MemberList::countDecMembers()=%d\n",m_numDecMembers);
205}
206
208{
209 if (m_numDocMembers!=-1) return; // used cached value
211 for (const auto &md : m_members)
212 {
213 if (md->isDetailedSectionVisible(m_container) && !md->isAlias())
214 {
215 // do not count enum values, since they do not produce entries of their own
216 if (md->memberType()==MemberType::EnumValue)
217 {
219 }
221 }
222 }
223 for (const auto &mg : m_memberGroupRefList)
224 {
225 mg->countDocMembers();
226 m_numDocMembers+=mg->numDocMembers();
227 m_numDocEnumValues+=mg->numDocEnumValues();
228 }
229 //printf("MemberList::countDocMembers()=%d memberGroupList=%p\n",m_numDocMembers,memberGroupList);
230}
231
233{
234 //printf("MemberList(%p)::setAnonymousEnumType()\n",this);
235 for (const auto &md : m_members)
236 {
237 if (md->isBriefSectionVisible())
238 {
239 QCString name(md->name());
240 int i=name.findRev("::");
241 if (i!=-1) name=name.right(name.length()-i-2);
242 if (md->memberType()==MemberType::Enumeration && name[0]=='@')
243 {
244 for (const auto &vmd : md->enumFieldList())
245 {
247 if (vmdm)
248 {
249 QCString vtype=vmd->typeString();
250 if ((vtype.find(name))!=-1)
251 {
252 vmdm->setAnonymousEnumType(md);
253 }
254 }
255 }
256 }
257 }
258 }
259 for (const auto &mg : m_memberGroupRefList)
260 {
261 mg->setAnonymousEnumType();
262 }
263}
264
266{
267 int numEnumValues=0;
268 QCString name(md->name());
269 int i=name.findRev("::");
270 if (i!=-1) name=name.right(name.length()-i-2);
271 if (name[0]=='@')
272 {
273 for (const auto &vmd : m_members)
274 {
275 QCString vtype=vmd->typeString();
276 if ((vtype.find(name))!=-1)
277 {
278 numEnumValues++;
279 }
280 }
281 }
282 return numEnumValues;
283}
284
286{
287 for (const auto &md : m_members)
288 {
289 if (md->isBriefSectionVisible())
290 {
291 switch (md->memberType())
292 {
293 case MemberType::Define: // fall through
294 case MemberType::Typedef: // fall through
295 case MemberType::Variable: // fall through
296 case MemberType::Function: // fall through
297 case MemberType::Signal: // fall through
298 case MemberType::Slot: // fall through
299 case MemberType::DCOP: // fall through
300 case MemberType::Property: // fall through
301 case MemberType::Interface: // fall through
302 case MemberType::Service: // fall through
303 case MemberType::Sequence: // fall through
304 case MemberType::Dictionary: // fall through
306 return TRUE;
308 {
309 // if this is an anonymous enum and there are variables of this
310 // enum type (i.e. enumVars>0), then we do not show the enum here.
311 if (countEnumValues(md)==0) // show enum here
312 {
313 return TRUE;
314 }
315 }
316 break;
318 return TRUE;
320 {
322 {
323 return TRUE;
324 }
325 }
326 break;
327 }
328 }
329 }
330 return FALSE;
331}
332
334 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd, const GroupDef *gd,const ModuleDef *mod,
335 int indentLevel, const ClassDef *inheritedFrom,const QCString &inheritId
336 ) const
337{
338 //printf("----- writePlainDeclaration() ----\n");
339 if (numDecMembers()==-1)
340 {
341 err("MemberList::numDecMembers()==-1, so the members of this list have not been counted. Please report as a bug.\n");
342 abort();
343 }
345 {
346 //printf(" --> no members!\n");
347 return; // no members in this list
348 }
349 //printf(" --> writePlainDeclaration() numDecMembers()=%d\n",
350 // numDecMembers());
351
353
354 bool first=TRUE;
355 for (const auto &md : m_members)
356 {
357 //printf(">>> Member '%s' type=%d visible=%d inheritedFrom=%p inheritId=%s\n",
358 // qPrint(md->name()),md->memberType(),md->isBriefSectionVisible(),(void*)inheritedFrom,qPrint(inheritId));
359 if ((inheritedFrom==nullptr || !md->isReimplementedBy(inheritedFrom)) &&
360 md->isBriefSectionVisible())
361 {
362 //printf(">>> rendering\n");
363 switch(md->memberType())
364 {
365 case MemberType::Define: // fall through
366 //case MemberType::Prototype: // fall through
367 case MemberType::Typedef: // fall through
368 case MemberType::Variable: // fall through
369 case MemberType::Function: // fall through
370 case MemberType::Signal: // fall through
371 case MemberType::Slot: // fall through
372 case MemberType::DCOP: // fall through
373 case MemberType::Property: // fall through
374 case MemberType::Interface: // fall through
375 case MemberType::Service: // fall through
376 case MemberType::Sequence: // fall through
377 case MemberType::Dictionary: // fall through
379 {
380 if (first) ol.startMemberList(),first=FALSE;
381 md->writeDeclaration(ol,cd,nd,fd,gd,mod,inGroup,indentLevel,inheritedFrom,inheritId);
382 break;
383 }
385 {
386 // if this is an anonymous enum and there are variables of this
387 // enum type (i.e. enumVars>0), then we do not show the enum here.
388 if (countEnumValues(md)==0) // show enum here
389 {
390 //printf("Enum!!\n");
391 if (first)
392 {
393 ol.startMemberList();
394 first=FALSE;
395 }
398 bool detailsLinkable = md->hasDetailedDescription();
399 if (!detailsLinkable)
400 {
401 ol.startDoxyAnchor(md->getOutputFileBase(),QCString(),md->anchor(),md->name(),QCString());
402 ol.addLabel(md->getOutputFileBase(),md->anchor());
403 }
404 if (md->isSliceLocal())
405 {
406 ol.writeString("local ");
407 }
408 ol.writeString("enum ");
409 if (md->getLanguage()==SrcLangExt::Cpp && md->isStrong())
410 {
411 if (md->isEnumStruct())
412 {
413 ol.writeString("struct ");
414 }
415 else
416 {
417 ol.writeString("class ");
418 }
419 }
421 md->writeEnumDeclaration(ol,cd,nd,fd,gd,mod);
422 if (!detailsLinkable)
423 {
424 ol.endDoxyAnchor(md->getOutputFileBase(),md->anchor());
425 }
427 if (!md->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
428 {
429 auto parser { createDocParser() };
430 auto ast { validatingParseDoc(*parser.get(),
431 md->briefFile(),md->briefLine(),
432 cd,md,
433 md->briefDescription(),
434 TRUE,FALSE,
436 Config_getBool(MARKDOWN_SUPPORT)) };
437 if (!ast->isEmpty())
438 {
439 ol.startMemberDescription(md->anchor());
440 ol.writeDoc(ast.get(),cd,md);
441 if (md->hasDetailedDescription())
442 {
444 ol.docify(" ");
445 ol.startTextLink(md->getOutputFileBase(),
446 md->anchor());
447 ol.parseText(theTranslator->trMore());
448 ol.endTextLink();
449 ol.enableAll();
450 }
452 }
453 }
454 ol.endMemberDeclaration(md->anchor(),inheritId);
455 }
456 md->warnIfUndocumented();
457 break;
458 }
460 if (inheritedFrom==nullptr)
461 {
462 if (first)
463 {
464 ol.startMemberList();
465 first=FALSE;
466 }
467 md->writeDeclaration(ol,cd,nd,fd,gd,mod,inGroup,indentLevel,inheritedFrom,inheritId);
468 break;
469 }
471 {
472 if (inGroup)
473 {
474 //printf("EnumValue!\n");
475 if (first) ol.startMemberList(),first=FALSE;
476 md->writeDeclaration(ol,cd,nd,fd,gd,mod,true,indentLevel,inheritedFrom,inheritId);
477 }
478 }
479 break;
480 }
481 }
482 }
483
484 if (!first)
485 {
486 ol.endMemberList();
487 }
488
490 //printf("----- end writePlainDeclaration() ----\n");
491}
492
493/** Writes the list of members to the output.
494 * @param ol Output list to write to
495 * @param cd non-null if this list is part of class documentation.
496 * @param nd non-null if this list is part of namespace documentation.
497 * @param fd non-null if this list is part of file documentation.
498 * @param gd non-null if this list is part of group documentation.
499 * @param mod non-null if this list is part of module documentation.
500 * @param title Title to use for the member list.
501 * @param subtitle Sub title to use for the member list.
502 * @param showEnumValues Obsolete, always set to FALSE.
503 * @param showInline if set to TRUE if title is rendered differently
504 * @param inheritedFrom if not 0, the list is shown inside the
505 * given class as inherited members, parameter cd points to the
506 * class containing the members.
507 * @param lt Type of list that is inherited from.
508 * @param showSectionTitle do we show the "additional members" header or not?
509 * When combining public and protected inherited members under a single header only for the first list it should be shown
510 */
512 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
513 const QCString &title,const QCString &subtitle, bool showEnumValues,
514 bool showInline,const ClassDef *inheritedFrom,MemberListType lt,bool showSectionTitle) const
515{
516 (void)showEnumValues; // unused
517
518 //printf("----- writeDeclaration() this=%p ---- inheritedFrom=%p\n",this,inheritedFrom);
519 bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
520 QCString inheritId;
521
522 const Definition *ctx = cd;
523 if (ctx==nullptr && nd) ctx = nd;
524 if (ctx==nullptr && gd) ctx = gd;
525 if (ctx==nullptr && mod) ctx = mod;
526 if (ctx==nullptr && fd) ctx = fd;
527
528 //printf("%p: MemberList::writeDeclaration(title='%s',subtitle='%s')=%d inheritedFrom=%p\n",
529 // (void*)this,qPrint(title),qPrint(subtitle),numDecMembers(),(void*)inheritedFrom);
530
531 int num = numDecMembers();
532 int numEnumValues = numDecEnumValues();
533 if (inheritedFrom)
534 {
535 if (cd && !optimizeVhdl)
536 {
537 inheritId = substitute(lt.toLabel(),"-","_")+"_"+
539 if (showSectionTitle && !title.isEmpty())
540 {
541 ol.writeInheritedSectionTitle(inheritId,cd->getReference(),
542 cd->getOutputFileBase(),
543 cd->anchor(),title,cd->displayName());
544 }
545 }
546 }
547 else if (num>numEnumValues)
548 {
549 if (!title.isEmpty())
550 {
551 if (showInline)
552 {
554 }
555 else
556 {
557 ol.startMemberHeader(m_listType.toLabel());
558 }
559 ol.parseText(title);
560 if (showInline)
561 {
562 ol.endInlineHeader();
563 }
564 else
565 {
566 ol.endMemberHeader();
567 }
568 }
569 if (!subtitle.stripWhiteSpace().isEmpty())
570 {
572 ol.generateDoc("[generated]",-1,ctx,nullptr,subtitle,FALSE,FALSE,
573 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
575 }
576 }
577 if (num>numEnumValues)
578 {
580 // TODO: Two things need to be worked out for proper VHDL output:
581 // 1. Signals and types under the group need to be
582 // formatted to associate them with the group somehow
583 // indentation, or at the very least, extra space after
584 // the group is done
585 // 2. This might need to be repeated below for memberGroupLists
586 if (optimizeVhdl) // use specific declarations function
587 {
588 VhdlDocGen::writeVhdlDeclarations(this,ol,nullptr,cd,nullptr,nullptr,nullptr);
589 }
590 else
591 {
592 writePlainDeclarations(ol,inGroup,cd,nd,fd,gd,mod,0,inheritedFrom,inheritId);
593 }
594
595 //printf("memberGroupList=%p\n",memberGroupList);
596 for (const auto &mg : m_memberGroupRefList)
597 {
598 bool hasHeader=!mg->header().isEmpty();
599 if (inheritId.isEmpty())
600 {
601 //printf("mg->header=%s hasHeader=%d\n",qPrint(mg->header()),hasHeader);
602 ol.startMemberGroupHeader(hasHeader);
603 if (hasHeader)
604 {
605 ol.parseText(mg->header());
606 }
608 if (!mg->documentation().isEmpty())
609 {
610 //printf("Member group has docs!\n");
612 ol.generateDoc(mg->docFile(),mg->docLine(),mg->memberContainer(),nullptr,mg->documentation()+"\n",FALSE,FALSE,
613 QCString(),FALSE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
615 }
616 ol.startMemberGroup();
617 }
618 //printf("--- mg->writePlainDeclarations ---\n");
619 mg->writePlainDeclarations(ol,inGroup,cd,nd,fd,gd,mod,0,inheritedFrom,inheritId);
620 if (inheritId.isEmpty())
621 {
622 ol.endMemberGroup(hasHeader);
623 }
624 }
625 }
626 if (inheritedFrom && cd)
627 {
628 // also add members that of this list type, that are grouped together
629 // in a separate list in class 'inheritedFrom'
630 cd->addGroupedInheritedMembers(ol,m_listType,inheritedFrom,inheritId);
631 }
632 //printf("----- end writeDeclaration() ----\n");
633}
634
636 const QCString &scopeName, const Definition *container,
637 const QCString &title,bool showEnumValues,bool showInline) const
638{
639 if (numDocMembers()==-1)
640 {
641 err("MemberList::numDocMembers()==-1, so the members of this list have not been counted. Please report as a bug.\n");
642 abort();
643 }
644
645 if (numDocMembers()==0) return;
646 if (!showEnumValues && numDocMembers()<=numDocEnumValues()) return;
647
648 if (!title.isEmpty())
649 {
652 ol.writeRuler();
654 ol.startGroupHeader(showInline ? 2 : 0);
655 ol.parseText(title);
656 ol.endGroupHeader(showInline ? 2 : 0);
657 }
659
660 struct OverloadInfo
661 {
662 uint32_t count = 1;
663 uint32_t total = 0;
664 };
665 std::unordered_map<std::string,OverloadInfo> overloadInfo;
666 // count the number of overloaded members
667 for (const auto &md : m_members)
668 {
669 if (md->isDetailedSectionVisible(m_container) &&
670 !(md->isEnumValue() && !showInline))
671 {
672 auto it = overloadInfo.emplace(md->name().str(),OverloadInfo()).first;
673 it->second.total++;
674 }
675 }
676
677 for (const auto &md : m_members)
678 {
679 if (md->isDetailedSectionVisible(m_container) &&
680 !(md->isEnumValue() && !showInline))
681 {
682 auto it = overloadInfo.find(md->name().str());
683 uint32_t overloadCount = it->second.total;
684 uint32_t &count = it->second.count;
686 if (mdm)
687 {
688 mdm->writeDocumentation(this,count++,overloadCount,ol,scopeName,container,
689 m_container==MemberListContainer::Group,showEnumValues,showInline);
690 }
691 }
692 }
693 //printf("MemberList::writeDocumentation() -- member groups %d\n",memberGroupList->count());
694 for (const auto &mg : m_memberGroupRefList)
695 {
696 mg->writeDocumentation(ol,scopeName,container,showEnumValues,showInline);
697 }
698 ol.endMemberDocList();
699}
700
701// members in a table
703 const Definition *container) const
704{
705 //printf("MemberList count=%d enumValues=%d\n",numDocMembers(),numDocEnumValues());
706 if (numDocMembers()<=numDocEnumValues()) return; // only enum values and they should be excluded
707
708 const ClassDef *cd = nullptr;
709 if (container && container->definitionType()==Definition::TypeClass)
710 {
711 cd = toClassDef(container);
712 }
713 ol.startMemberDocSimple(cd && cd->isJavaEnum());
714 for (const auto &md : m_members)
715 {
717 if (mdm)
718 {
720 }
721 }
722 ol.endMemberDocSimple(cd && cd->isJavaEnum());
723}
724
725// separate member pages
727 const QCString &scopeName, const DefinitionMutable *container, int hierarchyLevel) const
728{
729 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
730
731 struct OverloadInfo
732 {
733 uint32_t count = 1;
734 uint32_t total = 0;
735 };
736 std::unordered_map<std::string,OverloadInfo> overloadInfo;
737
738 // count the number of overloaded members
739 for (const auto &imd : m_members)
740 {
742
743 if (md && md->hasDetailedDescription())
744 {
745 auto it = overloadInfo.emplace(md->name().str(),OverloadInfo()).first;
746 it->second.total++;
747 }
748 }
749
750 for (const auto &imd : m_members)
751 {
752 Definition *container_d = toDefinition(const_cast<DefinitionMutable*>(container));
754 if (md && md->hasDetailedDescription())
755 {
756 auto it = overloadInfo.find(md->name().str());
757 uint32_t overloadCount = it->second.total;
758 uint32_t &count = it->second.count;
759 QCString diskName=md->getOutputFileBase();
760 QCString title=md->qualifiedName();
761 startFile(ol,diskName,md->name(),title,HighlightedItem::None,!generateTreeView,diskName, hierarchyLevel);
762 if (!generateTreeView)
763 {
764 container->writeNavigationPath(ol);
765 ol.endQuickIndices();
766 }
767 ol.startContents();
768
769 if (generateTreeView)
770 {
771 md->writeDocumentation(this,count++,overloadCount,ol,scopeName,container_d,m_container==MemberListContainer::Group);
772
773 ol.endContents();
774 endFileWithNavPath(ol,container_d);
775 }
776 else
777 {
778 ol.writeString("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n"
779 " <tr>\n"
780 " <td valign=\"top\">\n");
781
782 container->writeQuickMemberLinks(ol,md);
783
784 ol.writeString(" </td>\n");
785 ol.writeString(" <td valign=\"top\" class=\"mempage\">\n");
786
787 md->writeDocumentation(this,count++,overloadCount,ol,scopeName,container_d,m_container==MemberListContainer::Group);
788
789 ol.writeString(" </td>\n");
790 ol.writeString(" </tr>\n");
791 ol.writeString("</table>\n");
792
793 endFile(ol);
794 }
795 }
796 }
797 for (const auto &mg : m_memberGroupRefList)
798 {
799 mg->writeDocumentationPage(ol,scopeName,container);
800 }
801}
802
804{
805 m_memberGroupRefList.push_back(mg);
806}
807
809{
810 for (const auto &imd : m_members)
811 {
813 if (md && !md->isAlias() && (md->getGroupDef()==nullptr || def->definitionType()==Definition::TypeGroup))
814 {
815 md->addListReference(def);
816 const MemberVector &enumFields = md->enumFieldList();
817 if (md->memberType()==MemberType::Enumeration && !enumFields.empty())
818 {
819 //printf(" Adding enum values!\n");
820 for (const auto &vmd : enumFields)
821 {
823 if (vmdm)
824 {
825 //printf(" adding %s\n",qPrint(vmd->name()));
826 vmdm->addListReference(def);
827 }
828 }
829 }
830 }
831 }
832 for (const auto &mg : m_memberGroupRefList)
833 {
834 mg->addListReferences(def);
835 }
836}
837
839{
840 for (const auto &imd : m_members)
841 {
843 if (md)
844 {
846 }
847 }
848 for (const auto &mg : m_memberGroupRefList)
849 {
850 mg->findSectionsInDocumentation(d);
851 }
852}
853
855{
856 m_needsSorting = b;
857}
858
859void MemberList::writeTagFile(TextStream &tagFile,bool useQualifiedName,bool showNamespaceMembers)
860{
861 for (const auto &imd : m_members)
862 {
864 if (md)
865 {
866 if (md->getLanguage()!=SrcLangExt::VHDL)
867 {
868 md->writeTagFile(tagFile,useQualifiedName,showNamespaceMembers);
869 if (md->memberType()==MemberType::Enumeration && !md->isStrong())
870 {
871 for (const auto &ivmd : md->enumFieldList())
872 {
874 if (vmd)
875 {
876 vmd->writeTagFile(tagFile,useQualifiedName,showNamespaceMembers);
877 }
878 }
879 }
880 }
881 else
882 {
883 VhdlDocGen::writeTagFile(md,tagFile);
884 }
885 }
886 }
887 for (const auto &mg : m_memberGroupRefList)
888 {
889 mg->writeTagFile(tagFile,useQualifiedName);
890 }
891}
892
893// compute the HTML anchors for a list of members
895{
896 //int count=0;
897 for (const auto &md : m_members)
898 {
900 if (mdm && !md->isReference())
901 {
902 mdm->setAnchor();
903 }
904 }
905}
906
A abstract class representing of a compound symbol.
Definition classdef.h:104
virtual bool isJavaEnum() const =0
virtual void addGroupedInheritedMembers(OutputList &ol, MemberListType lt, const ClassDef *inheritedFrom, const QCString &inheritId) const =0
The common base class of all entity definitions found in the sources.
Definition definition.h:76
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual QCString getDefFileName() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual QCString getReference() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual bool isAlias() const =0
virtual QCString getOutputFileBase() const =0
virtual bool isReference() const =0
virtual const QCString & name() const =0
A model of a file symbol.
Definition filedef.h:99
A model of a group of symbols.
Definition groupdef.h:52
A model of a class/file/namespace member symbol.
Definition memberdef.h:48
virtual bool isDestructor() const =0
virtual bool hasDetailedDescription() const =0
virtual bool isConstructor() const =0
virtual GroupDef * getGroupDef()=0
virtual const MemberVector & enumFieldList() const =0
virtual MemberType memberType() const =0
virtual bool isStrong() const =0
virtual QCString argsString() const =0
virtual void writeMemberDocSimple(OutputList &ol, const Definition *container) const =0
virtual void writeDocumentation(const MemberList *ml, int memCount, int memTotal, OutputList &ol, const QCString &scopeName, const Definition *container, bool inGroup, bool showEnumValues=FALSE, bool showInline=FALSE) const =0
virtual void addListReference(Definition *d)=0
virtual void findSectionsInDocumentation()=0
virtual void setAnonymousEnumType(const MemberDef *md)=0
virtual void writeTagFile(TextStream &, bool useQualifiedName, bool showNamespaceMembers) const =0
virtual void setAnchor()=0
A class representing a group of members.
Definition membergroup.h:43
int numDecEnumValues() const
Definition memberlist.h:117
int m_numDecEnumValues
Definition memberlist.h:151
int numDocMembers() const
Definition memberlist.h:118
int numDocEnumValues() const
Definition memberlist.h:119
void writeDeclarations(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, const QCString &title, const QCString &subtitle, bool showEnumValues=FALSE, bool showInline=FALSE, const ClassDef *inheritedFrom=nullptr, MemberListType lt=MemberListType::PubMethods(), bool showSectionTitle=true) const
Writes the list of members to the output.
int countEnumValues(const MemberDef *md) const
void writeTagFile(TextStream &, bool useQualifiedName=false, bool showNamespaceMembers=true)
int m_numDocMembers
Definition memberlist.h:152
int m_numDecMembers
Definition memberlist.h:150
MemberListContainer container() const
Definition memberlist.h:114
void addListReferences(Definition *def)
void countDecMembers()
MemberList(MemberListType lt, MemberListContainer container)
int numDecMembers() const
Definition memberlist.h:116
MemberGroupRefList m_memberGroupRefList
Definition memberlist.h:154
bool m_needsSorting
Definition memberlist.h:157
void writePlainDeclarations(OutputList &ol, bool inGroup, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, int indentLevel, const ClassDef *inheritedFrom, const QCString &inheritId) const
void setAnonymousEnumType()
int countInheritableMembers(const ClassDef *inheritedFrom) const
int m_numDocEnumValues
Definition memberlist.h:153
MemberListContainer m_container
Definition memberlist.h:155
void setNeedsSorting(bool b)
void writeSimpleDocumentation(OutputList &ol, const Definition *container) const
void countDocMembers()
MemberListType m_listType
Definition memberlist.h:156
void writeDocumentation(OutputList &ol, const QCString &scopeName, const Definition *container, const QCString &title, bool showEnumValues=FALSE, bool showInline=FALSE) const
void findSectionsInDocumentation(const Definition *d)
void addMemberGroup(MemberGroup *mg)
void setAnchors()
void writeDocumentationPage(OutputList &ol, const QCString &scopeName, const DefinitionMutable *container, int hierarchyLevel=0) const
bool declVisible() const
Wrapper class for the MemberListType type.
Definition types.h:184
constexpr const char * toLabel() const
Definition types.h:240
A vector of MemberDef object.
Definition memberlist.h:34
bool empty() const noexcept
Definition memberlist.h:59
An abstract interface of a namespace symbol.
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:314
void startMemberGroupHeader(bool b)
Definition outputlist.h:506
void writeString(const QCString &text)
Definition outputlist.h:412
void startGroupHeader(int extraLevels=0)
Definition outputlist.h:454
void startMemberDeclaration()
Definition outputlist.h:570
void disable(OutputType o)
void writeRuler()
Definition outputlist.h:522
void endContents()
Definition outputlist.h:619
void endMemberDescription()
Definition outputlist.h:568
void endInlineHeader()
Definition outputlist.h:488
void endMemberGroupDocs()
Definition outputlist.h:512
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md)
Definition outputlist.h:384
void startMemberDescription(const QCString &anchor, const QCString &inheritId=QCString(), bool typ=false)
Definition outputlist.h:566
void endDoxyAnchor(const QCString &fn, const QCString &anchor)
Definition outputlist.h:542
void docify(const QCString &s)
Definition outputlist.h:438
void endMemberDocList()
Definition outputlist.h:480
void startMemberGroup()
Definition outputlist.h:514
void startMemberList()
Definition outputlist.h:482
void endTextLink()
Definition outputlist.h:445
void endMemberItem(OutputGenerator::MemberItemType type)
Definition outputlist.h:496
void endMemberList()
Definition outputlist.h:484
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
void addLabel(const QCString &fName, const QCString &anchor)
Definition outputlist.h:544
void pushGeneratorState()
void insertMemberAlign(bool templ=FALSE)
Definition outputlist.h:518
void startInlineHeader()
Definition outputlist.h:486
void disableAllBut(OutputType o)
void popGeneratorState()
void endGroupHeader(int extraLevels=0)
Definition outputlist.h:456
void startDoxyAnchor(const QCString &fName, const QCString &manName, const QCString &anchor, const QCString &name, const QCString &args)
Definition outputlist.h:538
void endQuickIndices()
Definition outputlist.h:605
void endMemberGroupHeader()
Definition outputlist.h:508
void endMemberGroup(bool last)
Definition outputlist.h:516
void startMemberGroupDocs()
Definition outputlist.h:510
void startContents()
Definition outputlist.h:617
void startMemberDocSimple(bool b)
Definition outputlist.h:721
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:572
void enableAll()
void endMemberHeader()
Definition outputlist.h:472
void endMemberSubtitle()
Definition outputlist.h:476
void startMemberItem(const QCString &anchor, OutputGenerator::MemberItemType type, const QCString &id=QCString())
Definition outputlist.h:494
void startMemberDocList()
Definition outputlist.h:478
void endMemberDocSimple(bool b)
Definition outputlist.h:723
void startMemberSubtitle()
Definition outputlist.h:474
void parseText(const QCString &textStr)
void writeInheritedSectionTitle(const QCString &id, const QCString &ref, const QCString &file, const QCString &anchor, const QCString &title, const QCString &name)
Definition outputlist.h:574
void startTextLink(const QCString &file, const QCString &anchor)
Definition outputlist.h:443
void startMemberHeader(const QCString &anchor, int typ=2)
Definition outputlist.h:470
This is an alternative implementation of QCString.
Definition qcstring.h:101
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:245
const std::string & str() const
Definition qcstring.h:537
QCString right(size_t len) const
Definition qcstring.h:219
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:91
Text streaming class that buffers data.
Definition textstream.h:36
static void writeTagFile(MemberDefMutable *mdef, TextStream &tagFile)
static void writeVhdlDeclarations(const MemberList *, OutputList &, const GroupDef *, const ClassDef *, const FileDef *, const NamespaceDef *, const ModuleDef *)
ClassDef * toClassDef(Definition *d)
#define Config_getBool(name)
Definition config.h:33
Definition * toDefinition(DefinitionMutable *dm)
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:54
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, bool indexWords, bool isExample, const QCString &exampleName, bool singleLine, bool linkFromIndex, bool markdownSupport)
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
Definition index.cpp:421
void startFile(OutputList &ol, const QCString &name, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel)
Definition index.cpp:402
void endFileWithNavPath(OutputList &ol, const Definition *d)
Definition index.cpp:441
Translator * theTranslator
Definition language.cpp:71
MemberDefMutable * toMemberDefMutable(Definition *d)
int genericCompareMembers(const MemberDef *c1, const MemberDef *c2)
#define err(fmt,...)
Definition message.h:84
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:477
int qstricmp_sort(const char *str1, const char *str2)
Definition qcstring.h:86
const char * qPrint(const char *s)
Definition qcstring.h:672
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
@ Enumeration
Definition types.h:395
@ EnumValue
Definition types.h:396
@ Dictionary
Definition types.h:406
@ Interface
Definition types.h:403
@ Sequence
Definition types.h:405
@ Variable
Definition types.h:393
@ Property
Definition types.h:401
@ Typedef
Definition types.h:394
@ Function
Definition types.h:392
@ Service
Definition types.h:404
MemberListContainer
Definition types.h:310
QCString stripPath(const QCString &s)
Definition util.cpp:5292
A bunch of utility functions.