Doxygen
Loading...
Searching...
No Matches
classdef.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2024 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16#include <cstdio>
17#include <algorithm>
18
19#include "types.h"
20#include "classdef.h"
21#include "classlist.h"
22#include "entry.h"
23#include "doxygen.h"
24#include "membername.h"
25#include "message.h"
26#include "config.h"
27#include "util.h"
28#include "diagram.h"
29#include "language.h"
30#include "htmlhelp.h"
31#include "example.h"
32#include "outputlist.h"
33#include "dot.h"
34#include "dotclassgraph.h"
35#include "dotrunner.h"
36#include "defargs.h"
37#include "debug.h"
38#include "docparser.h"
39#include "searchindex.h"
40#include "vhdldocgen.h"
41#include "layout.h"
42#include "arguments.h"
43#include "memberlist.h"
44#include "groupdef.h"
45#include "filedef.h"
46#include "namespacedef.h"
47#include "membergroup.h"
48#include "definitionimpl.h"
49#include "symbolresolver.h"
50#include "fileinfo.h"
51#include "trace.h"
52#include "moduledef.h"
53
54//-----------------------------------------------------------------------------
55
57 const ArgumentLists *actualParams,uint32_t *actualParamIndex)
58{
59 //bool optimizeOutputJava = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
60 bool hideScopeNames = Config_getBool(HIDE_SCOPE_NAMES);
61 //printf("qualifiedNameWithTemplateParameters() localName=%s\n",qPrint(cd->localName()));
62 QCString scName;
63 const Definition *d=cd->getOuterScope();
64 if (d)
65 {
67 {
68 const ClassDef *ocd=toClassDef(d);
69 scName = ocd->qualifiedNameWithTemplateParameters(actualParams,actualParamIndex);
70 }
71 else if (!hideScopeNames)
72 {
73 scName = d->qualifiedName();
74 }
75 }
76
77 SrcLangExt lang = cd->getLanguage();
78 QCString scopeSeparator = getLanguageSpecificSeparator(lang);
79 if (!scName.isEmpty()) scName+=scopeSeparator;
80
81 bool isSpecialization = cd->localName().find('<')!=-1;
82 QCString clName = cd->className();
83 scName+=clName;
84 if (lang!=SrcLangExt::CSharp && !cd->templateArguments().empty())
85 {
86 if (actualParams && *actualParamIndex<actualParams->size())
87 {
88 const ArgumentList &al = actualParams->at(*actualParamIndex);
90 {
91 scName+=tempArgListToString(al,lang);
92 }
93 (*actualParamIndex)++;
94 }
95 else
96 {
98 {
99 scName+=tempArgListToString(cd->templateArguments(),lang);
100 }
101 }
102 }
103 //printf("qualifiedNameWithTemplateParameters: scope=%s qualifiedName=%s\n",qPrint(name()),qPrint(scName));
104 return scName;
105}
106
107static QCString makeDisplayName(const ClassDef *cd,bool includeScope)
108{
109 //bool optimizeOutputForJava = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
110 SrcLangExt lang = cd->getLanguage();
111 //bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
112 QCString n;
113 if (lang==SrcLangExt::VHDL)
114 {
116 }
117 else
118 {
119 if (cd->tagLessReference())
120 {
121 int idx=cd->name().findRev("::");
122 if (includeScope || idx==-1)
123 {
124 n=cd->name();
125 }
126 else
127 {
128 n=cd->name().mid(idx+2);
129 }
130 }
131 else if (includeScope)
132 {
134 }
135 else
136 {
137 n=cd->className();
138 }
139 }
140 if (cd->isAnonymous())
141 {
143 }
145 if (sep!="::")
146 {
147 n=substitute(n,"::",sep);
148 }
149 if (cd->compoundType()==ClassDef::Protocol && n.endsWith("-p"))
150 {
151 n="<"+n.left(n.length()-2)+">";
152 }
153 return n;
154}
155
156//-----------------------------------------------------------------------------
157
159{
160 if (lang==SrcLangExt::Fortran)
161 {
162 switch (compType)
163 {
164 case ClassDef::Class: return "module";
165 case ClassDef::Struct: return "type";
166 case ClassDef::Union: return "union";
167 case ClassDef::Interface: return "interface";
168 case ClassDef::Protocol: return "protocol";
169 case ClassDef::Category: return "category";
170 case ClassDef::Exception: return "exception";
171 default: return "unknown";
172 }
173 }
174 else
175 {
176 switch (compType)
177 {
178 case ClassDef::Class: return isJavaEnum ? "enum" : "class";
179 case ClassDef::Struct: return "struct";
180 case ClassDef::Union: return "union";
181 case ClassDef::Interface: return lang==SrcLangExt::ObjC ? "class" : "interface";
182 case ClassDef::Protocol: return "protocol";
183 case ClassDef::Category: return "category";
184 case ClassDef::Exception: return "exception";
185 case ClassDef::Service: return "service";
186 case ClassDef::Singleton: return "singleton";
187 default: return "unknown";
188 }
189 }
190}
191
192//-----------------------------------------------------------------------------
193
194
195/** Implementation of the ClassDef interface */
196class ClassDefImpl final : public DefinitionMixin<ClassDefMutable>
197{
198 public:
199 ClassDefImpl(const QCString &fileName,int startLine,int startColumn,
200 const QCString &name,CompoundType ct,
201 const QCString &ref=QCString(),const QCString &fName=QCString(),
202 bool isSymbol=TRUE,bool isJavaEnum=FALSE);
203
204 DefType definitionType() const override { return TypeClass; }
205 std::unique_ptr<ClassDef> deepCopy(const QCString &name) const override;
206 void moveTo(Definition *) override;
207 CodeSymbolType codeSymbolType() const override;
208 QCString getOutputFileBase() const override;
209 QCString getInstanceOutputFileBase() const override;
210 QCString getSourceFileBase() const override;
211 QCString getReference() const override;
212 bool isReference() const override;
213 bool isLocal() const override;
214 ClassLinkedRefMap getClasses() const override;
215 bool hasDocumentation() const override;
216 bool hasDetailedDescription() const override;
217 QCString collaborationGraphFileName() const override;
218 QCString inheritanceGraphFileName() const override;
219 QCString displayName(bool includeScope=TRUE) const override;
220 CompoundType compoundType() const override;
221 QCString compoundTypeString() const override;
222 const BaseClassList &baseClasses() const override;
223 void updateBaseClasses(const BaseClassList &bcd) override;
224 const BaseClassList &subClasses() const override;
225 void updateSubClasses(const BaseClassList &bcd) override;
226 const MemberNameInfoLinkedMap &memberNameInfoLinkedMap() const override;
227 Protection protection() const override;
228 bool isLinkableInProject() const override;
229 bool isLinkable() const override;
230 bool isVisibleInHierarchy() const override;
231 bool visibleInParentsDeclList() const override;
232 const ArgumentList &templateArguments() const override;
233 FileDef *getFileDef() const override;
234 ModuleDef *getModuleDef() const override;
235 const MemberDef *getMemberByName(const QCString &) const override;
236 int isBaseClass(const ClassDef *bcd,bool followInstances,const QCString &templSpec) const override;
237 bool isSubClass(ClassDef *bcd,int level=0) const override;
238 bool isAccessibleMember(const MemberDef *md) const override;
239 const TemplateInstanceList &getTemplateInstances() const override;
240 const ClassDef *templateMaster() const override;
241 bool isTemplate() const override;
242 const IncludeInfo *includeInfo() const override;
243 const UsesClassList &usedImplementationClasses() const override;
244 const UsesClassList &usedByImplementationClasses() const override;
245 const ConstraintClassList &templateTypeConstraints() const override;
246 bool isTemplateArgument() const override;
247 const Definition *findInnerCompound(const QCString &name) const override;
250 const ArgumentLists *actualParams=nullptr,uint32_t *actualParamIndex=nullptr) const override;
251 bool isAbstract() const override;
252 bool isObjectiveC() const override;
253 bool isFortran() const override;
254 bool isCSharp() const override;
255 bool isFinal() const override;
256 bool isSealed() const override;
257 bool isPublished() const override;
258 bool isExtension() const override;
259 bool isForwardDeclared() const override;
260 bool isInterface() const override;
261 ClassDef *categoryOf() const override;
262 QCString className() const override;
263 MemberList *getMemberList(MemberListType lt) const override;
264 const MemberLists &getMemberLists() const override;
265 const MemberGroupList &getMemberGroups() const override;
266 const TemplateNameMap &getTemplateBaseClassNames() const override;
267 bool isUsedOnly() const override;
268 QCString anchor() const override;
269 bool isEmbeddedInOuterScope() const override;
270 bool isSimple() const override;
271 const ClassDef *tagLessReference() const override;
272 const MemberDef *isSmartPointer() const override;
273 bool isJavaEnum() const override;
274 QCString title() const override;
275 QCString generatedFromFiles() const override;
276 const FileList &usedFiles() const override;
277 const ArgumentList &typeConstraints() const override;
278 const ExampleList &getExamples() const override;
279 bool hasExamples() const override;
280 QCString getMemberListFileName() const override;
281 bool subGrouping() const override;
282 bool isSliceLocal() const override;
283 bool hasNonReferenceSuperClass() const override;
284 QCString requiresClause() const override;
285 StringVector getQualifiers() const override;
286 bool containsOverload(const MemberDef *md) const override;
287 bool isImplicitTemplateInstance() const override;
288
289 ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
290 const QCString &templSpec,bool &freshInstance) override;
291 void insertBaseClass(ClassDef *,const QCString &name,Protection p,Specifier s,const QCString &t=QCString()) override;
292 void insertSubClass(ClassDef *,Protection p,Specifier s,const QCString &t=QCString()) override;
293 void insertExplicitTemplateInstance(ClassDef *instance,const QCString &spec) override;
294 void setIncludeFile(FileDef *fd,const QCString &incName,bool local,bool force) override;
295 void insertMember(MemberDef *) override;
296 void insertUsedFile(const FileDef *) override;
297 bool addExample(const QCString &anchor,const QCString &name, const QCString &file) override;
298 void mergeCategory(ClassDef *category) override;
299 void setFileDef(FileDef *fd) override;
300 void setModuleDef(ModuleDef *mod) override;
301 void setSubGrouping(bool enabled) override;
302 void setProtection(Protection p) override;
303 void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs) override;
304 void addInnerCompound(Definition *d) override;
305 void addUsedClass(ClassDef *cd,const QCString &accessName,Protection prot) override;
306 void addUsedByClass(ClassDef *cd,const QCString &accessName,Protection prot) override;
307 void setIsStatic(bool b) override;
308 void setCompoundType(CompoundType t) override;
309 void setClassName(const QCString &name) override;
310 void setClassSpecifier(TypeSpecifier spec) override;
311 void addQualifiers(const StringVector &qualifiers) override;
312 void setTemplateArguments(const ArgumentList &al) override;
313 void setTemplateBaseClassNames(const TemplateNameMap &templateNames) override;
314 void setTemplateMaster(const ClassDef *tm) override;
315 void setImplicitTemplateInstance(bool b) override;
316 void setTypeConstraints(const ArgumentList &al) override;
317 void addMemberToTemplateInstance(const MemberDef *md, const ArgumentList &templateArguments, const QCString &templSpec) override;
318 void addMembersToTemplateInstance(const ClassDef *cd,const ArgumentList &templateArguments,const QCString &templSpec) override;
319 void makeTemplateArgument(bool b=TRUE) override;
320 void setCategoryOf(ClassDef *cd) override;
321 void setUsedOnly(bool b) override;
322 void setTagLessReference(const ClassDef *cd) override;
323 void setMetaData(const QCString &md) override;
324 void findSectionsInDocumentation() override;
325 void addMembersToMemberGroup() override;
326 void addListReferences() override;
327 void addRequirementReferences() override;
328 void addTypeConstraints() override;
329 void computeAnchors() override;
330 void mergeMembers() override;
331 void sortMemberLists() override;
333 void writeDocumentation(OutputList &ol) const override;
334 void writeDocumentationForInnerClasses(OutputList &ol) const override;
335 void writeMemberPages(OutputList &ol) const override;
336 void writeMemberList(OutputList &ol) const override;
337 void writeQuickMemberLinks(OutputList &ol,const MemberDef *md) const override;
338 void writePageNavigation(OutputList &ol) const override;
339 void writeSummaryLinks(OutputList &ol) const override;
340 void reclassifyMember(MemberDefMutable *md,MemberType t) override;
341 void writeInlineDocumentation(OutputList &ol) const override;
342 void writeDeclarationLink(OutputList &ol,bool &found,
343 const QCString &header,bool localNames) const override;
344 void removeMemberFromLists(MemberDef *md) override;
345 void setAnonymousEnumType() override;
346 void countMembers() override;
347 void sortAllMembersList() override;
348
350 const ClassDef *inheritedFrom,const QCString &inheritId) const override;
351 void writeTagFile(TextStream &) const override;
352
353 int countMembersIncludingGrouped(MemberListType lt,const ClassDef *inheritedFrom,bool additional) const override;
354 int countMemberDeclarations(MemberListType lt,const ClassDef *inheritedFrom,
355 MemberListType lt2,bool invert,bool showAlways,ClassDefSet &visitedClasses) const override;
356 void writeMemberDeclarations(OutputList &ol,ClassDefSet &visitedClasses,
357 MemberListType lt,const QCString &title,
358 const QCString &subTitle=QCString(),
359 bool showInline=FALSE,const ClassDef *inheritedFrom=nullptr,
360 MemberListType lt2=MemberListType::Invalid(),bool invert=FALSE,bool showAlways=FALSE) const override;
361 void setRequiresClause(const QCString &req) override;
362 void setPrimaryConstructorParams(const ArgumentList &list) override;
363
364 // inheritance graph related members
365 CLASS_GRAPH_t hasInheritanceGraph() const override;
366 void overrideInheritanceGraph(CLASS_GRAPH_t e) override;
367
368 // collaboration graph related members
369 bool hasCollaborationGraph() const override;
370 void overrideCollaborationGraph(bool e) override;
371 private:
372 int countInheritedByNodes() const;
373 int countInheritsNodes() const;
374 int countInheritanceNodes() const;
376 void showUsedFiles(OutputList &ol) const;
377
378 void writeDocumentationContents(OutputList &ol,const QCString &pageTitle) const;
379 void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList);
380 void addMemberToList(MemberListType lt,MemberDef *md,bool isBrief);
383 const ClassDef *inheritedFrom,bool invert,
384 bool showAlways) const;
385 void writeMemberDocumentation(OutputList &ol,MemberListType lt,const QCString &title,bool showInline=FALSE) const;
388 int indentLevel,const ClassDef *inheritedFrom,const QCString &inheritId) const;
389 void writeBriefDescription(OutputList &ol,bool exampleFlag) const;
390 void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag,
391 const QCString &title,const QCString &anchor=QCString()) const;
392 void writeIncludeFiles(OutputList &ol) const;
394 void writeInheritanceGraph(OutputList &ol) const;
395 void writeCollaborationGraph(OutputList &ol) const;
396 void writeMemberGroups(OutputList &ol,bool showInline=FALSE) const;
397 void writeNestedClasses(OutputList &ol,const QCString &title) const;
398 void writeInlineClasses(OutputList &ol) const;
399 void startMemberDeclarations(OutputList &ol) const;
400 void endMemberDeclarations(OutputList &ol) const;
401 void startMemberDocumentation(OutputList &ol) const;
402 void endMemberDocumentation(OutputList &ol) const;
403 void writeAuthorSection(OutputList &ol) const;
404 void writeMoreLink(OutputList &ol,const QCString &anchor) const;
406
409 void addClassAttributes(OutputList &ol) const;
411 const ClassDef *inheritedFrom,bool invert,bool showAlways,
412 ClassDefSet &visitedClasses) const;
414 QCString &title,QCString &subtitle) const;
415 void addTypeConstraint(const QCString &typeConstraint,const QCString &type);
416 void writeTemplateSpec(OutputList &ol,const Definition *d,
417 const QCString &type,SrcLangExt lang) const;
418 void mergeMembersFromBaseClasses(bool mergeVirtualBaseClass);
420 private:
421 /*! file name that forms the base for the output file containing the
422 * class documentation. For compatibility with Qt (e.g. links via tag
423 * files) this name cannot be derived from the class name directly.
424 */
426
427 /*! file name used for the list of all members */
429
430 /*! file name used for the collaboration diagram */
432
433 /*! file name used for the inheritance graph */
435
436 /*! Include information about the header file should be included
437 * in the documentation. 0 by default, set by setIncludeFile().
438 */
439 std::unique_ptr<IncludeInfo> m_incInfo;
440
441 /*! List of base class (or super-classes) from which this class derives
442 * directly.
443 */
445
446 /*! List of sub-classes that directly derive from this class
447 */
449
450 /*! Namespace this class is part of
451 * (this is the inner most namespace in case of nested namespaces)
452 */
453 //NamespaceDef *m_nspace = nullptr;
454
455 /*! File this class is defined in */
456 FileDef *m_fileDef = nullptr;
457
458 /*! Module this class is defined in */
460
461 /*! List of all members (including inherited members) */
463
464 /*! Template arguments of this class */
466
467 /*! Type constraints for template parameters */
469
470 /*! Files that were used for generating the class documentation. */
472
473 /*! Examples that use this class */
475
476 /*! Holds the kind of "class" this is. */
478
479 /*! The protection level in which this class was found.
480 * Typically Public, but for nested classes this can also be Protected
481 * or Private.
482 */
484
485 /*! The inner classes contained in this class. Will be 0 if there are
486 * no inner classes.
487 */
489
490 /* classes for the collaboration diagram */
493
495
496 /*! Template instances that exists of this class, the key in the
497 * dictionary is the template argument list.
498 */
500
502
503 /*! The class this class is an instance of. */
504 const ClassDef *m_templateMaster = nullptr;
505
506 /*! local class name which could be a typedef'ed alias name. */
508
509 /*! If this class is a Objective-C category, then this points to the
510 * class which is extended.
511 */
513
515
516 /* user defined member groups */
518
519 /*! Is this an abstract class? */
520 bool m_isAbstract = false;
521
522 /*! Is the class part of an unnamed namespace? */
523 bool m_isStatic = false;
524
525 /*! TRUE if classes members are merged with those of the base classes. */
526 bool m_membersMerged = false;
527
528 /*! TRUE if the class is defined in a source file rather than a header file. */
529 bool m_isLocal = false;
530
531 bool m_isTemplArg = false;
532
533 /*! Does this class group its user-grouped members
534 * as a sub-section of the normal (public/protected/..)
535 * groups?
536 */
537 bool m_subGrouping = false;
538
539 /** Reason of existence is a "use" relation */
540 bool m_usedOnly = false;
541
542 /** List of titles to use for the summary */
544
545 /** Is this a simple (non-nested) C structure? */
546 bool m_isSimple = false;
547
548 /** Does this class overloaded the -> operator? */
549 const MemberDef *m_arrowOperator = nullptr;
550
551 const ClassDef *m_tagLessRef = nullptr;
552
553 /** Does this class represent a Java style enum? */
554 bool m_isJavaEnum = false;
555
557
559
560 /** C++20 requires clause */
562
564
566 CLASS_GRAPH_t m_typeInheritanceGraph = CLASS_GRAPH_t::NO;
567
569
571};
572
573std::unique_ptr<ClassDef> createClassDef(
574 const QCString &fileName,int startLine,int startColumn,
575 const QCString &name,ClassDef::CompoundType ct,
576 const QCString &ref,const QCString &fName,
577 bool isSymbol,bool isJavaEnum)
578{
579 return std::make_unique<ClassDefImpl>(fileName,startLine,startColumn,name,ct,ref,fName,isSymbol,isJavaEnum);
580}
581//-----------------------------------------------------------------------------
582
583class ClassDefAliasImpl final : public DefinitionAliasMixin<ClassDef>
584{
585 public:
586 ClassDefAliasImpl(const Definition *newScope,const ClassDef *cd)
587 : DefinitionAliasMixin(newScope,cd) { init(); }
588 ~ClassDefAliasImpl() override { deinit(); }
590
591 DefType definitionType() const override { return TypeClass; }
592
593 const ClassDef *getCdAlias() const { return toClassDef(getAlias()); }
594 std::unique_ptr<ClassDef> deepCopy(const QCString &name) const override {
596 }
597 void moveTo(Definition *) override {}
598
600 { return getCdAlias()->codeSymbolType(); }
602 { return getCdAlias()->getOutputFileBase(); }
606 { return getCdAlias()->getSourceFileBase(); }
607 QCString getReference() const override
608 { return getCdAlias()->getReference(); }
609 bool isReference() const override
610 { return getCdAlias()->isReference(); }
611 bool isLocal() const override
612 { return getCdAlias()->isLocal(); }
614 { return getCdAlias()->getClasses(); }
615 bool hasDocumentation() const override
616 { return getCdAlias()->hasDocumentation(); }
617 bool hasDetailedDescription() const override
618 { return getCdAlias()->hasDetailedDescription(); }
623 QCString displayName(bool includeScope=TRUE) const override
624 { return makeDisplayName(this,includeScope); }
625 CompoundType compoundType() const override
626 { return getCdAlias()->compoundType(); }
628 { return getCdAlias()->compoundTypeString(); }
629 const BaseClassList &baseClasses() const override
630 { return getCdAlias()->baseClasses(); }
631 const BaseClassList &subClasses() const override
632 { return getCdAlias()->subClasses(); }
635 Protection protection() const override
636 { return getCdAlias()->protection(); }
637 bool isLinkableInProject() const override
638 { return getCdAlias()->isLinkableInProject(); }
639 bool isLinkable() const override
640 { return getCdAlias()->isLinkable(); }
641 bool isVisibleInHierarchy() const override
642 { return getCdAlias()->isVisibleInHierarchy(); }
643 bool visibleInParentsDeclList() const override
644 { return getCdAlias()->visibleInParentsDeclList(); }
645 const ArgumentList &templateArguments() const override
646 { return getCdAlias()->templateArguments(); }
647 FileDef *getFileDef() const override
648 { return getCdAlias()->getFileDef(); }
649 ModuleDef *getModuleDef() const override
650 { return getCdAlias()->getModuleDef(); }
651 const MemberDef *getMemberByName(const QCString &s) const override
652 { return getCdAlias()->getMemberByName(s); }
653 int isBaseClass(const ClassDef *bcd,bool followInstances,const QCString &templSpec) const override
654 { return getCdAlias()->isBaseClass(bcd,followInstances,templSpec); }
655 bool isSubClass(ClassDef *bcd,int level=0) const override
656 { return getCdAlias()->isSubClass(bcd,level); }
657 bool isAccessibleMember(const MemberDef *md) const override
658 { return getCdAlias()->isAccessibleMember(md); }
660 { return getCdAlias()->getTemplateInstances(); }
661 const ClassDef *templateMaster() const override
662 { return getCdAlias()->templateMaster(); }
663 bool isTemplate() const override
664 { return getCdAlias()->isTemplate(); }
665 const IncludeInfo *includeInfo() const override
666 { return getCdAlias()->includeInfo(); }
673 bool isTemplateArgument() const override
674 { return getCdAlias()->isTemplateArgument(); }
675 const Definition *findInnerCompound(const QCString &name) const override
676 { return getCdAlias()->findInnerCompound(name); }
680 const ArgumentLists *actualParams=nullptr,uint32_t *actualParamIndex=nullptr) const override
681 { return makeQualifiedNameWithTemplateParameters(this,actualParams,actualParamIndex); }
682 bool isAbstract() const override
683 { return getCdAlias()->isAbstract(); }
684 bool isObjectiveC() const override
685 { return getCdAlias()->isObjectiveC(); }
686 bool isFortran() const override
687 { return getCdAlias()->isFortran(); }
688 bool isCSharp() const override
689 { return getCdAlias()->isCSharp(); }
690 bool isFinal() const override
691 { return getCdAlias()->isFinal(); }
692 bool isSealed() const override
693 { return getCdAlias()->isSealed(); }
694 bool isPublished() const override
695 { return getCdAlias()->isPublished(); }
696 bool isExtension() const override
697 { return getCdAlias()->isExtension(); }
698 bool isForwardDeclared() const override
699 { return getCdAlias()->isForwardDeclared(); }
700 bool isInterface() const override
701 { return getCdAlias()->isInterface(); }
702 ClassDef *categoryOf() const override
703 { return getCdAlias()->categoryOf(); }
704 QCString className() const override
705 { return getCdAlias()->className(); }
707 { return getCdAlias()->getMemberList(lt); }
708 const MemberLists &getMemberLists() const override
709 { return getCdAlias()->getMemberLists(); }
710 const MemberGroupList &getMemberGroups() const override
711 { return getCdAlias()->getMemberGroups(); }
714 bool isUsedOnly() const override
715 { return getCdAlias()->isUsedOnly(); }
716 QCString anchor() const override
717 { return getCdAlias()->anchor(); }
718 bool isEmbeddedInOuterScope() const override
719 { return getCdAlias()->isEmbeddedInOuterScope(); }
720 bool isSimple() const override
721 { return getCdAlias()->isSimple(); }
722 const ClassDef *tagLessReference() const override
723 { return getCdAlias()->tagLessReference(); }
724 const MemberDef *isSmartPointer() const override
725 { return getCdAlias()->isSmartPointer(); }
726 bool isJavaEnum() const override
727 { return getCdAlias()->isJavaEnum(); }
728 QCString title() const override
729 { return getCdAlias()->title(); }
731 { return getCdAlias()->generatedFromFiles(); }
732 const FileList &usedFiles() const override
733 { return getCdAlias()->usedFiles(); }
734 const ArgumentList &typeConstraints() const override
735 { return getCdAlias()->typeConstraints(); }
736 const ExampleList &getExamples() const override
737 { return getCdAlias()->getExamples(); }
738 bool hasExamples() const override
739 { return getCdAlias()->hasExamples(); }
741 { return getCdAlias()->getMemberListFileName(); }
742 bool subGrouping() const override
743 { return getCdAlias()->subGrouping(); }
744 bool isSliceLocal() const override
745 { return getCdAlias()->isSliceLocal(); }
746 bool hasNonReferenceSuperClass() const override
748 QCString requiresClause() const override
749 { return getCdAlias()->requiresClause(); }
751 { return getCdAlias()->getQualifiers(); }
752 bool containsOverload(const MemberDef *md) const override
753 { return getCdAlias()->containsOverload(md); }
754
755 int countMembersIncludingGrouped(MemberListType lt,const ClassDef *inheritedFrom,bool additional) const override
756 { return getCdAlias()->countMembersIncludingGrouped(lt,inheritedFrom,additional); }
758 MemberListType lt2,bool invert,bool showAlways,ClassDefSet &visitedClasses) const override
759 { return getCdAlias()->countMemberDeclarations(lt,inheritedFrom,lt2,invert,showAlways,visitedClasses); }
760
761 void writeDeclarationLink(OutputList &ol,bool &found,
762 const QCString &header,bool localNames) const override
763 { getCdAlias()->writeDeclarationLink(ol,found,header,localNames); }
764 bool isImplicitTemplateInstance() const override
766
767 void writeDocumentation(OutputList &ol) const override
771 void writeMemberPages(OutputList &ol) const override
772 { getCdAlias()->writeMemberPages(ol); }
773 void writeMemberList(OutputList &ol) const override
774 { getCdAlias()->writeMemberList(ol); }
775 void writeQuickMemberLinks(OutputList &ol,const MemberDef *md) const override
776 { getCdAlias()->writeQuickMemberLinks(ol,md); }
777 void writeSummaryLinks(OutputList &ol) const override
778 { getCdAlias()->writeSummaryLinks(ol); }
779 void writePageNavigation(OutputList &ol) const override
783 void writeTagFile(TextStream &ol) const override
784 { getCdAlias()->writeTagFile(ol); }
786 MemberListType lt,const QCString &title,
787 const QCString &subTitle=QCString(),
788 bool showInline=FALSE,const ClassDef *inheritedFrom=nullptr,
789 MemberListType lt2=MemberListType::Invalid(),bool invert=FALSE,bool showAlways=FALSE) const override
790 { getCdAlias()->writeMemberDeclarations(ol,visitedClasses,lt,title,subTitle,showInline,inheritedFrom,lt2,invert,showAlways); }
792 const ClassDef *inheritedFrom,const QCString &inheritId) const override
793 { getCdAlias()->addGroupedInheritedMembers(ol,lt,inheritedFrom,inheritId); }
794
795 void updateBaseClasses(const BaseClassList &) override {}
796 void updateSubClasses(const BaseClassList &) override {}
797};
798
799std::unique_ptr<ClassDef> createClassDefAlias(const Definition *newScope,const ClassDef *cd)
800{
801 auto acd = std::make_unique<ClassDefAliasImpl>(newScope,cd);
802 //printf("cd name=%s localName=%s qualifiedName=%s qualifiedNameWith=%s displayName()=%s\n",
803 // qPrint(acd->name()),qPrint(acd->localName()),qPrint(acd->qualifiedName()),
804 // qPrint(acd->qualifiedNameWithTemplateParameters()),qPrint(acd->displayName()));
805 return acd;
806}
807
808//-----------------------------------------------------------------------------
809
810// constructs a new class definition
812 const QCString &defFileName,int defLine,int defColumn,
813 const QCString &nm,CompoundType ct,
814 const QCString &lref,const QCString &fName,
815 bool isSymbol,bool isJavaEnum)
816 : DefinitionMixin(defFileName,defLine,defColumn,removeRedundantWhiteSpace(nm),nullptr,nullptr,isSymbol)
817{
818 AUTO_TRACE("name={}",name());
819 setReference(lref);
820 m_compType = ct;
823 if (!fName.isEmpty())
824 {
826 }
827 else
828 {
829 m_fileName=compTypeString+name();
830 }
831 m_prot=Protection::Public;
832 //nspace=nullptr;
833 m_fileDef=nullptr;
834 m_moduleDef=nullptr;
835 m_subGrouping=Config_getBool(SUBGROUPING);
836 m_templateMaster =nullptr;
841 m_categoryOf = nullptr;
843 m_isSimple = Config_getBool(INLINE_SIMPLE_STRUCTS);
844 m_arrowOperator = nullptr;
845 m_tagLessRef = nullptr;
847 //QCString ns;
848 //extractNamespaceName(name,className,ns);
849 //printf("m_name=%s m_className=%s ns=%s\n",qPrint(m_name),qPrint(m_className),qPrint(ns));
850
851 // we cannot use getLanguage at this point, as setLanguage has not been called.
852 SrcLangExt lang = getLanguageFromFileName(defFileName);
853 if ((lang==SrcLangExt::Cpp || lang==SrcLangExt::ObjC) && guessSection(defFileName).isSource())
854 {
856 }
857 else
858 {
860 }
861 m_hasCollaborationGraph = Config_getBool(COLLABORATION_GRAPH);
863 m_memberListFileName = convertNameToFile(compTypeString+name()+"-members");
866 if (lref.isEmpty())
867 {
869 }
870 AUTO_TRACE_EXIT("m_fileName='{}'",m_fileName);
871}
872
873std::unique_ptr<ClassDef> ClassDefImpl::deepCopy(const QCString &name) const
874{
875 AUTO_TRACE("name='{}'",name);
876 auto result = std::make_unique<ClassDefImpl>(
878 std::string(),std::string(),true,m_isJavaEnum);
879 result->setBriefDescription(briefDescription(),briefFile(),briefLine());
880 result->setDocumentation(documentation(),docFile(),docLine());
881 result->setInbodyDocumentation(inbodyDocumentation(),inbodyFile(),inbodyLine());
882 result->setBodySegment(getStartDefLine(),getStartBodyLine(),getEndBodyLine());
883 result->setBodyDef(getBodyDef());
884 result->setLanguage(getLanguage());
885
886 // copy other members
887 result->m_memberListFileName = m_memberListFileName;
888 result->m_collabFileName = m_collabFileName;
889 result->m_inheritFileName = m_inheritFileName;
890 if (m_incInfo)
891 {
892 result->m_incInfo = std::make_unique<IncludeInfo>();
893 *(result->m_incInfo) = *m_incInfo;
894 }
895 result->m_inherits = m_inherits;
896 result->m_inheritedBy = m_inheritedBy;
897 result->m_fileDef = m_fileDef;
898 result->m_moduleDef = m_moduleDef;
899 result->m_tempArgs = m_tempArgs;
900 result->m_typeConstraints = m_typeConstraints;
901 result->m_files = m_files;
902 result->m_examples = m_examples;
903 result->m_compType = m_compType;
904 result->m_prot = m_prot;
905 result->m_usesImplClassList = m_usesImplClassList;
906 result->m_usedByImplClassList = m_usedByImplClassList;
907 result->m_constraintClassList = m_constraintClassList;
908 result->m_templateInstances = m_templateInstances;
909 result->m_templBaseClassNames = m_templBaseClassNames;
910 result->m_templateMaster = m_templateMaster;
911 result->m_className = m_className;
912 result->m_categoryOf = m_categoryOf;
913 result->m_isAbstract = m_isAbstract;
914 result->m_isStatic = m_isStatic;
915 result->m_membersMerged = m_membersMerged;
916 result->m_isLocal = m_isLocal;
917 result->m_isTemplArg = m_isTemplArg;
918 result->m_subGrouping = m_subGrouping;
919 result->m_usedOnly = m_usedOnly;
920 result->m_vhdlSummaryTitles = m_vhdlSummaryTitles;
921 result->m_isSimple = m_isSimple;
922 result->m_arrowOperator = m_arrowOperator;
923 result->m_tagLessRef = m_tagLessRef;
924 result->m_isJavaEnum = m_isJavaEnum;
925 result->m_spec = m_spec;
926 result->m_metaData = m_metaData;
927 result->m_requiresClause = m_requiresClause;
928 result->m_qualifiers = m_qualifiers;
929 result->m_hasCollaborationGraph = m_hasCollaborationGraph;
930 result->m_typeInheritanceGraph = m_typeInheritanceGraph;
931
932 // set new file name
934 result->m_fileName = compTypeString+name;
935 result->m_memberListFileName = convertNameToFile(compTypeString+name+"-members");
936 result->m_collabFileName = convertNameToFile(result->m_fileName+"_coll_graph");
937 result->m_inheritFileName = convertNameToFile(result->m_fileName+"_inherit_graph");
938 result->m_fileName = convertNameToFile(result->m_fileName);
939
940 // deep copy nested classes
941 for (const auto &innerCd : m_innerClasses)
942 {
943 QCString innerName = name+"::"+innerCd->localName();
944 if (Doxygen::classLinkedMap->find(innerName)==nullptr)
945 {
946 auto cd = Doxygen::classLinkedMap->add(innerName,innerCd->deepCopy(innerName));
947 result->addInnerCompound(cd);
949 if (cdm)
950 {
951 cdm->setOuterScope(result.get());
952 }
953 }
954 }
955
956 // copy all member list (and make deep copies of members)
957 for (auto &mni : m_allMemberNameInfoLinkedMap)
958 {
959 for (auto &mi : *mni)
960 {
961 const MemberDef *md=mi->memberDef();
962 auto newMd = md->deepCopy();
963 if (newMd)
964 {
965 AUTO_TRACE_ADD("Copying member {}",newMd->name());
966 auto mmd = toMemberDefMutable(newMd.get());
967 if (mmd)
968 {
969 mmd->moveTo(result.get());
970 }
971
972 result->internalInsertMember(newMd.get(),newMd->protection(),true);
973
974 // also add to the global list (which will own newMd)
975 MemberName *mn = Doxygen::memberNameLinkedMap->add(newMd->name());
976 mn->push_back(std::move(newMd));
977 }
978 }
979 }
980
981 return result;
982}
983
985{
986 //printf("%s::moveTo(%s)\n",qPrint(name()),qPrint(scope->name()));
987 setOuterScope(scope);
989 {
990 m_fileDef = toFileDef(scope);
991 }
992 else if (scope->definitionType()==Definition::TypeModule)
993 {
994 m_moduleDef = toModuleDef(scope);
995 }
996}
997
1002
1003QCString ClassDefImpl::displayName(bool includeScope) const
1004{
1005 return makeDisplayName(this,includeScope);
1006}
1007
1008// inserts a base/super class in the inheritance list
1010 Specifier s,const QCString &t)
1011{
1012 //printf("*** insert base class %s into %s\n",qPrint(cd->name()),qPrint(name()));
1013 m_inherits.emplace_back(cd,n,p,s,t);
1014 m_isSimple = FALSE;
1015}
1016
1017// inserts a derived/sub class in the inherited-by list
1019 Specifier s,const QCString &t)
1020{
1021 //printf("*** insert sub class %s into %s\n",qPrint(cd->name()),qPrint(name()));
1022 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
1023 if (!extractPrivate && cd->protection()==Protection::Private) return;
1024 m_inheritedBy.emplace_back(cd,QCString(),p,s,t);
1025 m_isSimple = FALSE;
1026}
1027
1029{
1030 for (auto &ml : m_memberLists)
1031 {
1032 if (!ml->listType().isDetailed())
1033 {
1035 }
1036 }
1037
1038 // add members inside sections to their groups
1039 for (const auto &mg : m_memberGroups)
1040 {
1041 if (mg->allMembersInSameSection() && m_subGrouping)
1042 {
1043 //printf("addToDeclarationSection(%s)\n",qPrint(mg->header()));
1044 mg->addToDeclarationSection();
1045 }
1046 }
1047}
1048
1049// adds new member definition to the class
1051 Protection prot,
1052 bool addToAllList
1053 )
1054{
1055 AUTO_TRACE("{} name={} isHidden={}",name(),md->name(),md->isHidden());
1056 if (md->isHidden()) return;
1057
1058 if (getLanguage()==SrcLangExt::VHDL)
1059 {
1061 m_vhdlSummaryTitles.insert(title.str());
1062 }
1063
1064 if (1 /*!isReference()*/) // changed to 1 for showing members of external
1065 // classes when HAVE_DOT and UML_LOOK are enabled.
1066 {
1067 bool isSimple=FALSE;
1068
1069 /********************************************/
1070 /* insert member in the declaration section */
1071 /********************************************/
1072 if (md->isRelated() && protectionLevelVisible(prot))
1073 {
1074 addMemberToList(MemberListType::Related(),md,TRUE);
1075 }
1076 else if (md->isFriend())
1077 {
1078 addMemberToList(MemberListType::Friends(),md,TRUE);
1079 }
1080 else
1081 {
1082 switch (md->memberType())
1083 {
1084 case MemberType::Service: // UNO IDL
1085 addMemberToList(MemberListType::Services(),md,TRUE);
1086 break;
1087 case MemberType::Interface: // UNO IDL
1088 addMemberToList(MemberListType::Interfaces(),md,TRUE);
1089 break;
1090 case MemberType::Signal: // Qt specific
1091 addMemberToList(MemberListType::Signals(),md,TRUE);
1092 break;
1093 case MemberType::DCOP: // KDE2 specific
1094 addMemberToList(MemberListType::DcopMethods(),md,TRUE);
1095 break;
1096 case MemberType::Property:
1097 addMemberToList(MemberListType::Properties(),md,TRUE);
1098 break;
1099 case MemberType::Event:
1100 addMemberToList(MemberListType::Events(),md,TRUE);
1101 break;
1102 case MemberType::Slot: // Qt specific
1103 switch (prot)
1104 {
1105 case Protection::Protected:
1106 case Protection::Package: // slots in packages are not possible!
1107 addMemberToList(MemberListType::ProSlots(),md,TRUE);
1108 break;
1109 case Protection::Public:
1110 addMemberToList(MemberListType::PubSlots(),md,TRUE);
1111 break;
1112 case Protection::Private:
1113 addMemberToList(MemberListType::PriSlots(),md,TRUE);
1114 break;
1115 }
1116 break;
1117 default: // any of the other members
1118 if (md->isStatic())
1119 {
1120 if (md->isVariable())
1121 {
1122 switch (prot)
1123 {
1124 case Protection::Protected:
1125 addMemberToList(MemberListType::ProStaticAttribs(),md,TRUE);
1126 break;
1127 case Protection::Package:
1128 addMemberToList(MemberListType::PacStaticAttribs(),md,TRUE);
1129 break;
1130 case Protection::Public:
1131 addMemberToList(MemberListType::PubStaticAttribs(),md,TRUE);
1132 break;
1133 case Protection::Private:
1134 addMemberToList(MemberListType::PriStaticAttribs(),md,TRUE);
1135 break;
1136 }
1137 }
1138 else // function
1139 {
1140 switch (prot)
1141 {
1142 case Protection::Protected:
1143 addMemberToList(MemberListType::ProStaticMethods(),md,TRUE);
1144 break;
1145 case Protection::Package:
1146 addMemberToList(MemberListType::PacStaticMethods(),md,TRUE);
1147 break;
1148 case Protection::Public:
1149 addMemberToList(MemberListType::PubStaticMethods(),md,TRUE);
1150 break;
1151 case Protection::Private:
1152 addMemberToList(MemberListType::PriStaticMethods(),md,TRUE);
1153 break;
1154 }
1155 }
1156 }
1157 else // not static
1158 {
1159 if (md->isVariable())
1160 {
1161 switch (prot)
1162 {
1163 case Protection::Protected:
1164 addMemberToList(MemberListType::ProAttribs(),md,TRUE);
1165 break;
1166 case Protection::Package:
1167 addMemberToList(MemberListType::PacAttribs(),md,TRUE);
1168 break;
1169 case Protection::Public:
1170 {
1171 addMemberToList(MemberListType::PubAttribs(),md,TRUE);
1172 const int MAX_CELL_SIZE=60;
1173 isSimple=md->typeString().length()+md->name().length()+md->argsString().length()<=MAX_CELL_SIZE;
1174 }
1175 break;
1176 case Protection::Private:
1177 addMemberToList(MemberListType::PriAttribs(),md,TRUE);
1178 break;
1179 }
1180 }
1181 else if (md->isTypedef() || md->isEnumerate() || md->isEnumValue())
1182 {
1183 switch (prot)
1184 {
1185 case Protection::Protected:
1186 addMemberToList(MemberListType::ProTypes(),md,TRUE);
1187 break;
1188 case Protection::Package:
1189 addMemberToList(MemberListType::PacTypes(),md,TRUE);
1190 break;
1191 case Protection::Public:
1192 addMemberToList(MemberListType::PubTypes(),md,TRUE);
1193 isSimple=!md->isEnumerate() &&
1194 !md->isEnumValue() &&
1195 md->typeString().find(")(")==-1; // func ptr typedef
1196 break;
1197 case Protection::Private:
1198 addMemberToList(MemberListType::PriTypes(),md,TRUE);
1199 break;
1200 }
1201 }
1202 else // member function
1203 {
1204 switch (prot)
1205 {
1206 case Protection::Protected:
1207 addMemberToList(MemberListType::ProMethods(),md,TRUE);
1208 break;
1209 case Protection::Package:
1210 addMemberToList(MemberListType::PacMethods(),md,TRUE);
1211 break;
1212 case Protection::Public:
1213 addMemberToList(MemberListType::PubMethods(),md,TRUE);
1214 break;
1215 case Protection::Private:
1216 addMemberToList(MemberListType::PriMethods(),md,TRUE);
1217 break;
1218 }
1219 }
1220 }
1221 break;
1222 }
1223 }
1224 if (!isSimple) // not a simple field -> not a simple struct
1225 {
1226 m_isSimple = FALSE;
1227 }
1228 //printf("adding %s simple=%d total_simple=%d\n",qPrint(name()),isSimple,m_isSimple);
1229
1230 /*******************************************************/
1231 /* insert member in the detailed documentation section */
1232 /*******************************************************/
1233 if ((md->isRelated() && protectionLevelVisible(prot)) || md->isFriend())
1234 {
1235 addMemberToList(MemberListType::RelatedMembers(),md,FALSE);
1236 }
1237 else if (md->isFunction() &&
1238 md->protection()==Protection::Private &&
1239 (md->virtualness()!=Specifier::Normal || md->isOverride() || md->isFinal()) &&
1240 Config_getBool(EXTRACT_PRIV_VIRTUAL))
1241 {
1242 addMemberToList(MemberListType::FunctionMembers(),md,FALSE);
1243 }
1244 else
1245 {
1246 switch (md->memberType())
1247 {
1248 case MemberType::Service: // UNO IDL
1249 addMemberToList(MemberListType::ServiceMembers(),md,FALSE);
1250 break;
1251 case MemberType::Interface: // UNO IDL
1252 addMemberToList(MemberListType::InterfaceMembers(),md,FALSE);
1253 break;
1254 case MemberType::Property:
1255 addMemberToList(MemberListType::PropertyMembers(),md,FALSE);
1256 break;
1257 case MemberType::Event:
1258 addMemberToList(MemberListType::EventMembers(),md,FALSE);
1259 break;
1260 case MemberType::Signal: // fall through
1261 case MemberType::DCOP:
1262 addMemberToList(MemberListType::FunctionMembers(),md,FALSE);
1263 break;
1264 case MemberType::Slot:
1265 if (protectionLevelVisible(prot))
1266 {
1267 addMemberToList(MemberListType::FunctionMembers(),md,FALSE);
1268 }
1269 break;
1270 default: // any of the other members
1271 if (protectionLevelVisible(prot))
1272 {
1273 switch (md->memberType())
1274 {
1275 case MemberType::Typedef:
1276 addMemberToList(MemberListType::TypedefMembers(),md,FALSE);
1277 break;
1278 case MemberType::Enumeration:
1279 addMemberToList(MemberListType::EnumMembers(),md,FALSE);
1280 break;
1281 case MemberType::EnumValue:
1282 addMemberToList(MemberListType::EnumValMembers(),md,FALSE);
1283 break;
1284 case MemberType::Function:
1285 if (md->isConstructor() || md->isDestructor())
1286 {
1287 m_memberLists.get(MemberListType::Constructors(),MemberListContainer::Class)->push_back(md);
1288 }
1289 else
1290 {
1291 addMemberToList(MemberListType::FunctionMembers(),md,FALSE);
1292 }
1293 break;
1294 case MemberType::Variable:
1295 addMemberToList(MemberListType::VariableMembers(),md,FALSE);
1296 break;
1297 case MemberType::Define:
1298 warn(md->getDefFileName(),md->getDefLine()-1,"A define ({}) cannot be made a member of {}",
1299 md->name(), this->name());
1300 break;
1301 default:
1302 err("Unexpected member type '{}' found!\n",md->memberTypeName());
1303 }
1304 }
1305 break;
1306 }
1307 }
1308
1309 /*************************************************/
1310 /* insert member in the appropriate member group */
1311 /*************************************************/
1312 // Note: this must be done AFTER inserting the member in the
1313 // regular groups
1314 //addMemberToGroup(md,groupId);
1315
1316 }
1317
1318 if (md->virtualness()==Specifier::Pure)
1319 {
1320 m_isAbstract=true;
1321 }
1322
1323 if (md->name()=="operator->")
1324 {
1325 m_arrowOperator=md;
1326 }
1327
1328 if (addToAllList &&
1329 !(Config_getBool(HIDE_FRIEND_COMPOUNDS) &&
1330 md->isFriend() &&
1331 (md->typeString()=="friend class" ||
1332 md->typeString()=="friend struct" ||
1333 md->typeString()=="friend union")))
1334 {
1335 //printf("=======> adding member %s to class %s\n",qPrint(md->name()),qPrint(name()));
1336
1338 mni->push_back(std::make_unique<MemberInfo>(md,prot,md->virtualness(),false,false));
1339 }
1340
1341 // if we already created template instances before inserting this member (i.e. due to a typedef or using statement)
1342 // then we also need to insert the member in the template instance.
1343 for (const auto &ti : getTemplateInstances())
1344 {
1345 AUTO_TRACE_ADD("member {} of class {} with template instance {}\n",md->name(),name(),ti.templSpec);
1346 ClassDefMutable *cdm = toClassDefMutable(ti.classDef);
1347 if (cdm)
1348 {
1349 cdm->addMemberToTemplateInstance(md,templateArguments(),ti.templSpec);
1350 }
1351 }
1352
1353}
1354
1359
1360// compute the anchors for all members
1362{
1363 for (auto &ml : m_memberLists)
1364 {
1365 if (!ml->listType().isDetailed())
1366 {
1367 ml->setAnchors();
1368 }
1369 }
1370
1371 for (const auto &mg : m_memberGroups)
1372 {
1373 mg->setAnchors();
1374 }
1375}
1376
1378{
1379 for (const auto &mg : m_memberGroups)
1380 {
1381 mg->distributeMemberGroupDocumentation();
1382 }
1383}
1384
1386{
1390 for (const auto &mg : m_memberGroups)
1391 {
1392 mg->findSectionsInDocumentation(this);
1393 }
1394 for (auto &ml : m_memberLists)
1395 {
1396 if (!ml->listType().isDetailed())
1397 {
1398 ml->findSectionsInDocumentation(this);
1399 }
1400 }
1401}
1402
1403
1404// add a file name to the used files set
1406{
1407 if (fd == nullptr) return;
1408
1409 if (std::find(m_files.begin(), m_files.end(), fd) == m_files.end()) m_files.push_back(fd);
1410
1411 for (const auto &ti : m_templateInstances)
1412 {
1413 if (ClassDefMutable *cdm = toClassDefMutable(ti.classDef)) cdm->insertUsedFile(fd);
1414 }
1415}
1416
1418{
1419 if (bcd.prot!=Protection::Public || bcd.virt!=Specifier::Normal)
1420 {
1421 ol.startTypewriter();
1422 ol.docify(" [");
1423 StringVector sl;
1424 if (bcd.prot==Protection::Protected) sl.emplace_back("protected");
1425 else if (bcd.prot==Protection::Private) sl.emplace_back("private");
1426 if (bcd.virt==Specifier::Virtual) sl.emplace_back("virtual");
1427 bool first=true;
1428 for (const auto &s : sl)
1429 {
1430 if (!first) ol.docify(", ");
1431 ol.docify(s);
1432 first=false;
1433 }
1434 ol.docify("]");
1435 ol.endTypewriter();
1436 }
1437}
1438
1440 const QCString &includeName,bool local, bool force)
1441{
1442 //printf("ClassDefImpl::setIncludeFile(%p,%s,%d,%d)\n",fd,includeName,local,force);
1443 if (!m_incInfo) m_incInfo = std::make_unique<IncludeInfo>();
1444 if ((!includeName.isEmpty() && m_incInfo->includeName.isEmpty()) ||
1445 (fd!=nullptr && m_incInfo->fileDef==nullptr)
1446 )
1447 {
1448 //printf("Setting file info\n");
1449 m_incInfo->fileDef = fd;
1450 m_incInfo->includeName = includeName;
1452 }
1453 if (force && !includeName.isEmpty())
1454 {
1455 m_incInfo->includeName = includeName;
1457 }
1458}
1459
1460// TODO: fix this: a nested template class can have multiple outer templates
1461//ArgumentList *ClassDefImpl::outerTemplateArguments() const
1462//{
1463// int ti;
1464// ClassDef *pcd=nullptr;
1465// int pi=0;
1466// if (m_tempArgs) return m_tempArgs;
1467// // find the outer most class scope
1468// while ((ti=name().find("::",pi))!=-1 &&
1469// (pcd=getClass(name().left(ti)))==0
1470// ) pi=ti+2;
1471// if (pcd)
1472// {
1473// return pcd->templateArguments();
1474// }
1475// return nullptr;
1476//}
1477
1478static void searchTemplateSpecs(/*in*/ const Definition *d,
1479 /*out*/ ArgumentLists &result,
1480 /*out*/ QCString &name,
1481 /*in*/ SrcLangExt lang)
1482{
1484 {
1485 if (d->getOuterScope())
1486 {
1487 searchTemplateSpecs(d->getOuterScope(),result,name,lang);
1488 }
1489 const ClassDef *cd=toClassDef(d);
1490 if (!name.isEmpty()) name+="::";
1491 QCString clName = d->localName();
1492 if (clName.endsWith("-p"))
1493 {
1494 clName = clName.left(clName.length()-2);
1495 }
1496 name+=clName;
1497 bool isSpecialization = d->localName().find('<')!=-1;
1498 if (!cd->templateArguments().empty())
1499 {
1500 result.push_back(cd->templateArguments());
1501 if (!isSpecialization)
1502 {
1503 name+=tempArgListToString(cd->templateArguments(),lang);
1504 }
1505 }
1506 }
1507 else
1508 {
1509 name+=d->qualifiedName();
1510 }
1511}
1512
1514 const QCString &type,SrcLangExt lang) const
1515{
1516 ArgumentLists specs;
1517 QCString name;
1518 searchTemplateSpecs(d,specs,name,lang);
1519 if (!specs.empty()) // class has template scope specifiers
1520 {
1522 for (const ArgumentList &al : specs)
1523 {
1524 ol.docify("template<");
1525 auto it = al.begin();
1526 while (it!=al.end())
1527 {
1528 Argument a = *it;
1530 a.type, // text
1531 LinkifyTextOptions().setScope(d).setFileScope(getFileDef()).setSelf(this));
1532 if (!a.name.isEmpty())
1533 {
1534 ol.docify(" ");
1535 ol.docify(a.name);
1536 }
1537 if (a.defval.length()!=0)
1538 {
1539 ol.docify(" = ");
1540 ol.docify(a.defval);
1541 }
1542 ++it;
1543 if (it!=al.end()) ol.docify(", ");
1544 }
1545 ol.docify(">");
1546 ol.lineBreak();
1547 }
1548 if (!m_requiresClause.isEmpty())
1549 {
1550 ol.docify("requires ");
1552 m_requiresClause, // text
1553 LinkifyTextOptions().setScope(d).setFileScope(getFileDef()).setSelf(this));
1554 ol.lineBreak();
1555 }
1556 ol.docify(type.lower()+" "+name);
1558 }
1559}
1560
1561void ClassDefImpl::writeBriefDescription(OutputList &ol,bool exampleFlag) const
1562{
1563 if (hasBriefDescription())
1564 {
1565 ol.startParagraph();
1566 ol.pushGeneratorState();
1568 ol.writeString(" - ");
1569 ol.popGeneratorState();
1571 briefLine(),
1572 this,
1573 nullptr,
1575 DocOptions()
1576 .setIndexWords(true)
1577 .setSingleLine(true));
1578 ol.pushGeneratorState();
1580 ol.writeString(" \n");
1582 ol.popGeneratorState();
1583
1584 if (hasDetailedDescription() || exampleFlag)
1585 {
1586 writeMoreLink(ol,anchor());
1587 }
1588
1589 ol.endParagraph();
1590 }
1591 ol.writeSynopsis();
1592}
1593
1595{
1596 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
1597
1598 ol.startTextBlock();
1599
1600 if (getLanguage()==SrcLangExt::Cpp)
1601 {
1602 writeTemplateSpec(ol,this,compoundTypeString(),SrcLangExt::Cpp);
1603 }
1604
1605 // repeat brief description
1606 if (!briefDescription().isEmpty() && repeatBrief)
1607 {
1609 briefLine(),
1610 this,
1611 nullptr,
1613 DocOptions());
1614 }
1615 if (!briefDescription().isEmpty() && repeatBrief &&
1616 !documentation().isEmpty())
1617 {
1618 ol.pushGeneratorState();
1620 ol.writeString("\n\n");
1621 ol.popGeneratorState();
1622 }
1623 // write documentation
1624 if (!documentation().isEmpty())
1625 {
1626 ol.generateDoc(docFile(),
1627 docLine(),
1628 this,
1629 nullptr,
1630 documentation(),
1631 DocOptions()
1632 .setIndexWords(true));
1633 }
1634 // write type constraints
1636
1637 ol.generateDoc(
1638 docFile(),docLine(),
1639 this,
1640 nullptr, // memberDef
1642 DocOptions()
1643 .setIndexWords(true));
1644
1645 // write examples
1646 if (hasExamples())
1647 {
1648 ol.startExamples();
1649 ol.startDescForItem();
1651 ol.endDescForItem();
1652 ol.endExamples();
1653 }
1654 writeSourceDef(ol);
1656 ol.endTextBlock();
1657}
1658
1660{
1661 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
1662 bool sourceBrowser = Config_getBool(SOURCE_BROWSER);
1663 return ((!briefDescription().isEmpty() && repeatBrief) ||
1664 (!documentation().isEmpty() || m_tempArgs.hasTemplateDocumentation()) ||
1665 (sourceBrowser && getStartBodyLine()!=-1 && getBodyDef()) ||
1667}
1668
1669// write the detailed description for this class
1670void ClassDefImpl::writeDetailedDescription(OutputList &ol, const QCString &/*pageType*/, bool exampleFlag,
1671 const QCString &title,const QCString &anchor) const
1672{
1673 if (hasDetailedDescription() || exampleFlag)
1674 {
1675 ol.pushGeneratorState();
1677 ol.writeRuler();
1678 ol.popGeneratorState();
1679
1680 ol.pushGeneratorState();
1682 ol.writeAnchor(QCString(),anchor.isEmpty() ? QCString("details") : anchor);
1683 ol.popGeneratorState();
1684
1685 if (!anchor.isEmpty())
1686 {
1687 ol.pushGeneratorState();
1691 ol.popGeneratorState();
1692 }
1693
1694 ol.startGroupHeader("details");
1695 ol.parseText(title);
1696 ol.endGroupHeader();
1697
1699 }
1700 else
1701 {
1702 //writeTemplateSpec(ol,this,pageType);
1703 }
1704}
1705
1707{
1708 QCString result;
1709 SrcLangExt lang = getLanguage();
1710 size_t numFiles = m_files.size();
1711 if (lang==SrcLangExt::Fortran)
1712 {
1713 result = theTranslator->trGeneratedFromFilesFortran(
1714 getLanguage()==SrcLangExt::ObjC && m_compType==Interface ? Class : m_compType,
1715 numFiles==1);
1716 }
1717 else if (isJavaEnum())
1718 {
1719 result = theTranslator->trEnumGeneratedFromFiles(numFiles==1);
1720 }
1721 else if (m_compType==Service)
1722 {
1723 result = theTranslator->trServiceGeneratedFromFiles(numFiles==1);
1724 }
1725 else if (m_compType==Singleton)
1726 {
1727 result = theTranslator->trSingletonGeneratedFromFiles(numFiles==1);
1728 }
1729 else
1730 {
1731 result = theTranslator->trGeneratedFromFiles(
1732 getLanguage()==SrcLangExt::ObjC && m_compType==Interface ? Class : m_compType,
1733 numFiles==1);
1734 }
1735 return result;
1736}
1737
1739{
1740 ol.pushGeneratorState();
1742
1743
1744 ol.writeRuler();
1745 ol.pushGeneratorState();
1747 ol.startParagraph();
1749 ol.endParagraph();
1750 ol.popGeneratorState();
1754
1755 bool first=TRUE;
1756 for (const auto &fd : m_files)
1757 {
1758 if (first)
1759 {
1760 first=FALSE;
1761 ol.startItemList();
1762 }
1763
1764 ol.startItemListItem();
1765 QCString path=fd->getPath();
1766 if (Config_getBool(FULL_PATH_NAMES))
1767 {
1768 ol.docify(stripFromPath(path));
1769 }
1770
1771 QCString fname = fd->name();
1772 if (!fd->getVersion().isEmpty()) // append version if available
1773 {
1774 fname += " (" + fd->getVersion() + ")";
1775 }
1776
1777 // for HTML
1778 ol.pushGeneratorState();
1780 if (fd->generateSourceFile())
1781 {
1782 ol.writeObjectLink(QCString(),fd->getSourceFileBase(),QCString(),fname);
1783 }
1784 else if (fd->isLinkable())
1785 {
1786 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),QCString(),fname);
1787 }
1788 else
1789 {
1790 ol.startBold();
1791 ol.docify(fname);
1792 ol.endBold();
1793 }
1794 ol.popGeneratorState();
1795
1796 // for other output formats
1797 ol.pushGeneratorState();
1799 if (fd->isLinkable())
1800 {
1801 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),QCString(),fname);
1802 }
1803 else
1804 {
1805 ol.docify(fname);
1806 }
1807 ol.popGeneratorState();
1808
1809 ol.endItemListItem();
1810 }
1811 if (!first) ol.endItemList();
1812
1813 ol.popGeneratorState();
1814}
1815
1817{
1818 int count=0;
1819 for (const auto &ibcd : m_inheritedBy)
1820 {
1821 const ClassDef *icd=ibcd.classDef;
1822 if ( icd->isVisibleInHierarchy()) count++;
1823 }
1824 return count;
1825}
1826
1828{
1829 int count=0;
1830 for (const auto &ibcd : m_inherits)
1831 {
1832 const ClassDef *icd=ibcd.classDef;
1833 if ( icd->isVisibleInHierarchy()) count++;
1834 }
1835 return count;
1836}
1837
1842
1844{
1845 bool haveDot = Config_getBool(HAVE_DOT);
1846 auto classGraph = m_typeInheritanceGraph;
1847
1848 if (classGraph == CLASS_GRAPH_t::NO) return;
1849 // count direct inheritance relations
1850 int count=countInheritanceNodes();
1851
1852 bool renderDiagram = FALSE;
1853 if (haveDot && (classGraph==CLASS_GRAPH_t::YES || classGraph==CLASS_GRAPH_t::GRAPH))
1854 // write class diagram using dot
1855 {
1856 DotClassGraph inheritanceGraph(this,GraphType::Inheritance);
1857 if (inheritanceGraph.isTooBig())
1858 {
1859 warn_uncond("Inheritance graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
1860 name(), inheritanceGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
1861 }
1862 else if (!inheritanceGraph.isTrivial())
1863 {
1864 ol.pushGeneratorState();
1866 ol.startDotGraph();
1867 ol.parseText(theTranslator->trClassDiagram(displayName()));
1868 ol.endDotGraph(inheritanceGraph);
1869 ol.popGeneratorState();
1870 renderDiagram = TRUE;
1871 }
1872 }
1873 else if ((classGraph==CLASS_GRAPH_t::YES || classGraph==CLASS_GRAPH_t::GRAPH || classGraph==CLASS_GRAPH_t::BUILTIN) && count>0)
1874 // write class diagram using built-in generator
1875 {
1876 ClassDiagram diagram(this); // create a diagram of this class.
1877 ol.startClassDiagram();
1879 ol.parseText(theTranslator->trClassDiagram(displayName()));
1882 renderDiagram = TRUE;
1883 }
1884
1885 if (renderDiagram) // if we already show the inheritance relations graphically,
1886 // then hide the text version
1887 {
1889 }
1890
1891 count = countInheritsNodes();
1892 if (count>0)
1893 {
1894 auto replaceFunc = [this,&ol](size_t entryIndex)
1895 {
1896 for (size_t index=0; index<m_inherits.size() ; index++)
1897 {
1898 const BaseClassDef &bcd=m_inherits[index];
1899 const ClassDef *cd=bcd.classDef;
1900
1901 if (cd->isVisibleInHierarchy()) // filter on the class we want to show
1902 {
1903 if (index==entryIndex) // found the requested index
1904 {
1905 // use the class name but with the template arguments as given
1906 // in the inheritance relation
1908 cd->displayName(),bcd.templSpecifiers);
1909
1910 if (cd->isLinkable())
1911 {
1913 cd->getOutputFileBase(),
1914 cd->anchor(),
1915 displayName);
1916 }
1917 else
1918 {
1919 ol.docify(displayName);
1920 }
1921 return;
1922 }
1923 }
1924 }
1925 };
1926
1927 ol.startParagraph();
1928 writeMarkerList(ol,
1929 theTranslator->trInheritsList(count).str(),
1930 static_cast<size_t>(count),
1931 replaceFunc);
1932 ol.endParagraph();
1933 }
1934
1935 // write subclasses
1936 count = countInheritedByNodes();
1937 if (count>0)
1938 {
1939 auto replaceFunc = [this,&ol](size_t entryIndex)
1940 {
1941 for (size_t index=0; index<m_inheritedBy.size() ; index++)
1942 {
1943 const BaseClassDef &bcd=m_inheritedBy[index];
1944 const ClassDef *cd=bcd.classDef;
1945 if (cd->isVisibleInHierarchy()) // filter on the class we want to show
1946 {
1947 if (index==entryIndex) // found the requested index
1948 {
1949 if (cd->isLinkable())
1950 {
1953 }
1954 else
1955 {
1956 ol.docify(cd->displayName());
1957 }
1958 return;
1959 }
1960 }
1961 }
1962 };
1963
1964 ol.startParagraph();
1965 writeMarkerList(ol,
1966 theTranslator->trInheritedByList(count).str(),
1967 static_cast<size_t>(count),
1968 replaceFunc);
1969 ol.endParagraph();
1970 }
1971
1972 if (renderDiagram)
1973 {
1974 ol.enableAll();
1975 }
1976}
1977
1979{
1980 if (Config_getBool(HAVE_DOT) && m_hasCollaborationGraph /*&& Config_getBool(COLLABORATION_GRAPH)*/)
1981 {
1982 DotClassGraph usageImplGraph(this,GraphType::Collaboration);
1983 if (usageImplGraph.isTooBig())
1984 {
1985 warn_uncond("Collaboration graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
1986 name(), usageImplGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
1987 }
1988 else if (!usageImplGraph.isTrivial())
1989 {
1990 ol.pushGeneratorState();
1992 ol.startDotGraph();
1993 ol.parseText(theTranslator->trCollaborationDiagram(displayName()));
1994 ol.endDotGraph(usageImplGraph);
1995 ol.popGeneratorState();
1996 }
1997 }
1998}
1999
2000
2002{
2003 if (m_incInfo)
2004 {
2005 QCString nm;
2006 const StringVector &paths = Config_getList(STRIP_FROM_PATH);
2007 if (!paths.empty() && m_incInfo->fileDef)
2008 {
2009 QCString abs = m_incInfo->fileDef->absFilePath();
2010 QCString potential;
2011 size_t length = 0;
2012 for (const auto &s : paths)
2013 {
2014 FileInfo info(s);
2015 if (info.exists())
2016 {
2017 QCString prefix = info.absFilePath();
2018 if (prefix.at(prefix.length() - 1) != '/')
2019 {
2020 prefix += '/';
2021 }
2022
2023 if (prefix.length() > length &&
2024 qstricmp(abs.left(prefix.length()).data(), prefix.data()) == 0) // case insensitive compare
2025 {
2026 length = prefix.length();
2027 potential = abs.right(abs.length() - prefix.length());
2028 }
2029 }
2030 }
2031
2032 if (length > 0)
2033 {
2034 nm = potential;
2035 }
2036 }
2037
2038 if (nm.isEmpty())
2039 {
2040 nm = m_incInfo->includeName;
2041 }
2042
2043 ol.startParagraph();
2044 ol.docify(theTranslator->trDefinedIn()+" ");
2045 ol.startTypewriter();
2046 ol.docify("<");
2047 if (m_incInfo->fileDef)
2048 {
2049 ol.writeObjectLink(QCString(),m_incInfo->fileDef->includeName(),QCString(),nm);
2050 }
2051 else
2052 {
2053 ol.docify(nm);
2054 }
2055 ol.docify(">");
2056 ol.endTypewriter();
2057 ol.endParagraph();
2058 }
2059
2060 // Write a summary of the Slice definition including metadata.
2061 ol.startParagraph();
2062 ol.startTypewriter();
2063 if (!m_metaData.isEmpty())
2064 {
2065 ol.docify(m_metaData);
2066 ol.lineBreak();
2067 }
2068 if (m_spec.isLocal())
2069 {
2070 ol.docify("local ");
2071 }
2072 if (m_spec.isInterface())
2073 {
2074 ol.docify("interface ");
2075 }
2076 else if (m_spec.isStruct())
2077 {
2078 ol.docify("struct ");
2079 }
2080 else if (m_spec.isException())
2081 {
2082 ol.docify("exception ");
2083 }
2084 else
2085 {
2086 ol.docify("class ");
2087 }
2088 ol.docify(stripScope(name()));
2089 if (!m_inherits.empty())
2090 {
2091 if (m_spec.isInterface() || m_spec.isException())
2092 {
2093 ol.docify(" extends ");
2094 bool first=true;
2095 for (const auto &ibcd : m_inherits)
2096 {
2097 if (!first) ol.docify(", ");
2098 ClassDef *icd = ibcd.classDef;
2099 ol.docify(icd->name());
2100 first=false;
2101 }
2102 }
2103 else
2104 {
2105 // Must be a class.
2106 bool implements = false;
2107 for (const auto &ibcd : m_inherits)
2108 {
2109 ClassDef *icd = ibcd.classDef;
2110 if (icd->isInterface())
2111 {
2112 implements = true;
2113 }
2114 else
2115 {
2116 ol.docify(" extends ");
2117 ol.docify(icd->name());
2118 }
2119 }
2120 if (implements)
2121 {
2122 ol.docify(" implements ");
2123 bool first = true;
2124 for (const auto &ibcd : m_inherits)
2125 {
2126 ClassDef *icd = ibcd.classDef;
2127 if (icd->isInterface())
2128 {
2129 if (!first) ol.docify(", ");
2130 first = false;
2131 ol.docify(icd->name());
2132 }
2133 }
2134 }
2135 }
2136 }
2137 ol.docify(" { ... }");
2138 ol.endTypewriter();
2139 ol.endParagraph();
2140}
2141
2143{
2144 if (m_incInfo /*&& Config_getBool(SHOW_HEADERFILE)*/)
2145 {
2146 SrcLangExt lang = getLanguage();
2147 QCString nm=m_incInfo->includeName.isEmpty() ?
2148 (m_incInfo->fileDef ?
2149 m_incInfo->fileDef->docName() : QCString()
2150 ) :
2151 m_incInfo->includeName;
2152 if (!nm.isEmpty())
2153 {
2154 ol.startParagraph();
2155 ol.startTypewriter();
2156 ol.docify(::includeStatement(lang,m_incInfo->kind));
2157 ol.docify(::includeOpen(lang,m_incInfo->kind));
2158 ol.pushGeneratorState();
2160 ol.docify(nm);
2163 if (m_incInfo->fileDef)
2164 {
2165 ol.writeObjectLink(QCString(),m_incInfo->fileDef->includeName(),QCString(),nm);
2166 }
2167 else
2168 {
2169 ol.docify(nm);
2170 }
2171 ol.popGeneratorState();
2172 ol.docify(::includeClose(lang,m_incInfo->kind));
2173 ol.endTypewriter();
2174 ol.endParagraph();
2175 }
2176 }
2177}
2178
2179void ClassDefImpl::writeMemberGroups(OutputList &ol,bool showInline) const
2180{
2181 // write user defined member groups
2182 for (const auto &mg : m_memberGroups)
2183 {
2184 if (!mg->allMembersInSameSection() || !m_subGrouping) // group is in its own section
2185 {
2186 mg->writeDeclarations(ol,this,nullptr,nullptr,nullptr,nullptr,showInline);
2187 }
2188 else // add this group to the corresponding member section
2189 {
2190 //printf("addToDeclarationSection(%s)\n",qPrint(mg->header()));
2191 //mg->addToDeclarationSection();
2192 }
2193 }
2194}
2195
2197{
2198 // nested classes
2199 m_innerClasses.writeDeclaration(ol,nullptr,title,TRUE);
2200}
2201
2203{
2204 m_innerClasses.writeDocumentation(ol,this);
2205}
2206
2208{
2209 //printf("%s: ClassDefImpl::startMemberDocumentation()\n",qPrint(name()));
2210 if (Config_getBool(SEPARATE_MEMBER_PAGES))
2211 {
2214 }
2215}
2216
2218{
2219 //printf("%s: ClassDefImpl::endMemberDocumentation()\n",qPrint(name()));
2220 if (Config_getBool(SEPARATE_MEMBER_PAGES))
2221 {
2224 }
2225}
2226
2228{
2229 //printf("%s: ClassDefImpl::startMemberDeclarations()\n",qPrint(name()));
2231}
2232
2234{
2235 //printf("%s: ClassDefImpl::endMemberDeclarations()\n",qPrint(name()));
2236 bool inlineInheritedMembers = Config_getBool(INLINE_INHERITED_MEMB);
2237 if (!inlineInheritedMembers && countAdditionalInheritedMembers()>0)
2238 {
2239 ol.startMemberHeader("inherited");
2240 ol.parseText(theTranslator->trAdditionalInheritedMembers());
2241 ol.endMemberHeader();
2243 }
2244 ol.endMemberSections();
2245}
2246
2248{
2249 ol.pushGeneratorState();
2251 ol.writeString("\n");
2252 ol.startGroupHeader();
2253 ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
2254 ol.endGroupHeader();
2255 ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString(PROJECT_NAME)));
2256 ol.popGeneratorState();
2257}
2258
2259
2261{
2262 static bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
2263 ol.pushGeneratorState();
2265 bool first=TRUE;
2266 SrcLangExt lang = getLanguage();
2267
2268 if (lang!=SrcLangExt::VHDL)
2269 {
2270 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
2271 {
2272 if (lde->kind()==LayoutDocEntry::ClassNestedClasses &&
2273 m_innerClasses.declVisible()
2274 )
2275 {
2276 for (const auto &innerCd : m_innerClasses)
2277 {
2278 if (!innerCd->isAnonymous() &&
2279 !innerCd->isExtension() &&
2280 (innerCd->protection()!=Protection::Private || extractPrivate) &&
2281 innerCd->visibleInParentsDeclList()
2282 )
2283 {
2284 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection *>(lde.get());
2285 ol.writeSummaryLink(QCString(),"nested-classes",ls->title(lang),first);
2286 first=FALSE;
2287 break;
2288 }
2289 }
2290 }
2291 else if (lde->kind()==LayoutDocEntry::ClassAllMembersLink &&
2293 !Config_getBool(OPTIMIZE_OUTPUT_FOR_C)
2294 )
2295 {
2296 ol.writeSummaryLink(getMemberListFileName(),"all-members-list",theTranslator->trListOfAllMembers(),first);
2297 first=FALSE;
2298 }
2299 else if (lde->kind()==LayoutDocEntry::MemberDecl)
2300 {
2301 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
2302 if (lmd)
2303 {
2304 MemberList * ml = getMemberList(lmd->type);
2305 if (ml && ml->declVisible())
2306 {
2307 ol.writeSummaryLink(QCString(),ml->listType().toLabel(),lmd->title(lang),first);
2308 first=FALSE;
2309 }
2310 }
2311 }
2312 }
2313 }
2314 else // VDHL only
2315 {
2316 for (const auto &s : m_vhdlSummaryTitles)
2317 {
2318 ol.writeSummaryLink(QCString(),convertToId(s),s,first);
2319 first=FALSE;
2320 }
2321 }
2322 if (!first)
2323 {
2324 ol.writeString(" </div>\n");
2325 }
2326 ol.popGeneratorState();
2327}
2328
2333
2335{
2336 if (!isLinkableInProject() || isArtificial()) return;
2337 tagFile << " <compound kind=\"";
2338 if (isFortran() && (compoundTypeString() == "type"))
2339 tagFile << "struct";
2340 else
2341 tagFile << compoundTypeString();
2342 tagFile << "\"";
2343 if (isObjectiveC()) { tagFile << " objc=\"yes\""; }
2344 tagFile << ">\n";
2345 tagFile << " <name>" << convertToXML(name()) << "</name>\n";
2348 tagFile << " <filename>" << convertToXML(fn) << "</filename>\n";
2349 if (!anchor().isEmpty())
2350 {
2351 tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>\n";
2352 }
2353 QCString idStr = id();
2354 if (!idStr.isEmpty())
2355 {
2356 tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>\n";
2357 }
2358 for (const Argument &a : m_tempArgs)
2359 {
2360 tagFile << " <templarg>" << convertToXML(a.type);
2361 if (!a.name.isEmpty())
2362 {
2363 tagFile << " " << convertToXML(a.name);
2364 }
2365 tagFile << "</templarg>\n";
2366 }
2367 for (const auto &ibcd : m_inherits)
2368 {
2369 ClassDef *cd=ibcd.classDef;
2370 if (cd && cd->isLinkable())
2371 {
2372 tagFile << " <base";
2373 if (ibcd.prot==Protection::Protected)
2374 {
2375 tagFile << " protection=\"protected\"";
2376 }
2377 else if (ibcd.prot==Protection::Private)
2378 {
2379 tagFile << " protection=\"private\"";
2380 }
2381 if (ibcd.virt==Specifier::Virtual)
2382 {
2383 tagFile << " virtualness=\"virtual\"";
2384 }
2386 cd->displayName(),ibcd.templSpecifiers);
2387 tagFile << ">" << convertToXML(displayName) << "</base>\n";
2388 }
2389 }
2390 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
2391 {
2392 switch (lde->kind())
2393 {
2394 case LayoutDocEntry::ClassNestedClasses:
2395 {
2396 for (const auto &innerCd : m_innerClasses)
2397 {
2398 if (innerCd->isLinkableInProject() && !innerCd->isImplicitTemplateInstance() &&
2399 protectionLevelVisible(innerCd->protection()) &&
2400 !innerCd->isEmbeddedInOuterScope()
2401 )
2402 {
2403 tagFile << " <class kind=\"" << innerCd->compoundTypeString() <<
2404 "\">" << convertToXML(innerCd->name()) << "</class>\n";
2405 }
2406 }
2407 }
2408 break;
2409 case LayoutDocEntry::MemberDecl:
2410 {
2411 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
2412 if (lmd)
2413 {
2414 MemberList * ml = getMemberList(lmd->type);
2415 if (ml)
2416 {
2417 ml->writeTagFile(tagFile);
2418 }
2419 }
2420 }
2421 break;
2422 case LayoutDocEntry::MemberGroups:
2423 {
2424 for (const auto &mg : m_memberGroups)
2425 {
2426 mg->writeTagFile(tagFile);
2427 }
2428 }
2429 break;
2430 default:
2431 break;
2432 }
2433 }
2434 writeDocAnchorsToTagFile(tagFile);
2435 tagFile << " </compound>\n";
2436}
2437
2438/** Write class documentation inside another container (i.e\. a group) */
2440{
2441 bool isSimple = m_isSimple;
2442
2443 ol.addIndexItem(name(),QCString());
2444 //printf("ClassDefImpl::writeInlineDocumentation(%s)\n",qPrint(name()));
2445
2446 // part 1: anchor and title
2447 QCString s = compoundTypeString()+" "+name();
2448
2449 // part 1a
2450 ol.pushGeneratorState();
2452 { // only HTML only
2453 ol.writeAnchor(QCString(),anchor());
2456 ol.parseText(s);
2457 ol.endMemberDocName();
2458 ol.endMemberDoc(FALSE);
2459 ol.writeString("</div>");
2460 ol.startIndent();
2461 }
2462 ol.popGeneratorState();
2463
2464 // part 1b
2465 ol.pushGeneratorState();
2468 { // for LaTeX/RTF only
2470 }
2471 ol.popGeneratorState();
2472
2473 // part 1c
2474 ol.pushGeneratorState();
2476 {
2477 // for LaTeX/RTF/Man
2478 ol.startGroupHeader("",1);
2479 ol.parseText(s);
2480 ol.endGroupHeader(1);
2481 }
2482 ol.popGeneratorState();
2483
2484 SrcLangExt lang=getLanguage();
2485
2486 // part 2: the header and detailed description
2487 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
2488 {
2489 switch (lde->kind())
2490 {
2491 case LayoutDocEntry::BriefDesc:
2492 {
2493 // since we already shown the brief description in the
2494 // declaration part of the container, so we use this to
2495 // show the details on top.
2497 }
2498 break;
2499 case LayoutDocEntry::ClassInheritanceGraph:
2501 break;
2502 case LayoutDocEntry::ClassCollaborationGraph:
2504 break;
2505 case LayoutDocEntry::MemberDeclStart:
2507 break;
2508 case LayoutDocEntry::MemberDecl:
2509 {
2510 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
2511 if (lmd)
2512 {
2513 ClassDefSet visitedClasses;
2514 if (!isSimple) writeMemberDeclarations(ol,visitedClasses,lmd->type,lmd->title(lang),lmd->subtitle(lang),TRUE);
2515 }
2516 }
2517 break;
2518 case LayoutDocEntry::MemberGroups:
2520 break;
2521 case LayoutDocEntry::MemberDeclEnd:
2523 break;
2524 case LayoutDocEntry::MemberDefStart:
2526 break;
2527 case LayoutDocEntry::MemberDef:
2528 {
2529 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
2530 if (lmd)
2531 {
2532 if (isSimple)
2533 {
2535 }
2536 else
2537 {
2538 writeMemberDocumentation(ol,lmd->type,lmd->title(lang),TRUE);
2539 }
2540 }
2541 }
2542 break;
2543 case LayoutDocEntry::MemberDefEnd:
2545 break;
2546 default:
2547 break;
2548 }
2549 }
2550
2551 // part 3: close the block
2552 ol.pushGeneratorState();
2554 { // HTML only
2555 ol.endIndent();
2556 }
2557 ol.popGeneratorState();
2558}
2559
2561{
2562 // TODO: clean up this mess by moving it to
2563 // the output generators...
2564 bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
2565 bool rtfHyperlinks = Config_getBool(RTF_HYPERLINKS);
2566 bool usePDFLatex = Config_getBool(USE_PDFLATEX);
2567
2568 // HTML only
2569 ol.pushGeneratorState();
2571 ol.docify(" ");
2573 anchor.isEmpty() ? QCString("details") : anchor);
2574 ol.parseText(theTranslator->trMore());
2575 ol.endTextLink();
2576 ol.popGeneratorState();
2577
2578 if (!anchor.isEmpty())
2579 {
2580 ol.pushGeneratorState();
2581 // LaTeX + RTF
2585 if (!(usePDFLatex && pdfHyperlinks))
2586 {
2588 }
2589 if (!rtfHyperlinks)
2590 {
2592 }
2593 ol.docify(" ");
2595 ol.parseText(theTranslator->trMore());
2596 ol.endTextLink();
2597 // RTF only
2599 ol.writeString("\\par");
2600 ol.popGeneratorState();
2601 }
2602}
2603
2605{
2606 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
2607 bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
2608 bool extractLocalClasses = Config_getBool(EXTRACT_LOCAL_CLASSES);
2609 bool linkable = isLinkable();
2610 return (!isAnonymous() && !isExtension() &&
2611 (protection()!=Protection::Private || extractPrivate) &&
2612 (linkable || (!hideUndocClasses && (!isLocal() || extractLocalClasses)))
2613 );
2614}
2615
2616void ClassDefImpl::writeDeclarationLink(OutputList &ol,bool &found,const QCString &header,bool localNames) const
2617{
2618 //bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
2619 //bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
2620 bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
2621 SrcLangExt lang = getLanguage();
2623 {
2624 if (!found) // first class
2625 {
2626 if (sliceOpt)
2627 {
2628 if (compoundType()==Interface)
2629 {
2630 ol.startMemberHeader("interfaces");
2631 }
2632 else if (compoundType()==Struct)
2633 {
2634 ol.startMemberHeader("structs");
2635 }
2636 else if (compoundType()==Exception)
2637 {
2638 ol.startMemberHeader("exceptions");
2639 }
2640 else // compoundType==Class
2641 {
2642 ol.startMemberHeader("nested-classes");
2643 }
2644 }
2645 else // non-Slice optimization: single header for class/struct/..
2646 {
2647 ol.startMemberHeader("nested-classes");
2648 }
2649 if (!header.isEmpty())
2650 {
2651 ol.parseText(header);
2652 }
2653 else if (lang==SrcLangExt::VHDL)
2654 {
2656 }
2657 else
2658 {
2659 ol.parseText(lang==SrcLangExt::Fortran ?
2660 theTranslator->trDataTypes() :
2661 theTranslator->trCompounds());
2662 }
2663 ol.endMemberHeader();
2664 ol.startMemberList();
2665 found=TRUE;
2666 }
2668 QCString ctype = compoundTypeString();
2669 QCString cname = displayName(!localNames);
2670 QCString anc = anchor();
2671 if (anc.isEmpty()) anc = cname; else anc.prepend(cname+"_");
2673
2674 if (lang!=SrcLangExt::VHDL) // for VHDL we swap the name and the type
2675 {
2676 if (isSliceLocal())
2677 {
2678 ol.writeString("local ");
2679 }
2680 ol.writeString(ctype);
2681 ol.writeString(" ");
2682 ol.insertMemberAlign();
2683 }
2684 if (isLinkable())
2685 {
2688 anchor(),
2689 cname
2690 );
2691 }
2692 else
2693 {
2694 ol.startBold();
2695 ol.docify(cname);
2696 ol.endBold();
2697 }
2698 if (lang==SrcLangExt::VHDL) // now write the type
2699 {
2700 ol.writeString(" ");
2701 ol.insertMemberAlign();
2703 }
2705
2706 // add the brief description if available
2707 if (!briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
2708 {
2709 auto parser { createDocParser() };
2710 auto ast { validatingParseDoc(*parser.get(),
2711 briefFile(),
2712 briefLine(),
2713 this,
2714 nullptr,
2716 DocOptions()
2717 .setSingleLine(true))
2718 };
2719 if (!ast->isEmpty())
2720 {
2722 ol.writeDoc(ast.get(),this,nullptr);
2723 if (isLinkableInProject())
2724 {
2725 writeMoreLink(ol,anchor());
2726 }
2728 }
2729 }
2731 }
2732}
2733
2735{
2736 StringVector sl;
2737 if (isFinal()) sl.emplace_back("final");
2738 if (isSealed()) sl.emplace_back("sealed");
2739 if (isAbstract()) sl.emplace_back("abstract");
2740 if (isExported()) sl.emplace_back("export");
2741 if (getLanguage()==SrcLangExt::IDL && isPublished()) sl.emplace_back("published");
2742
2743 for (const auto &sx : m_qualifiers)
2744 {
2745 bool alreadyAdded = std::find(sl.begin(), sl.end(), sx) != sl.end();
2746 if (!alreadyAdded)
2747 {
2748 sl.push_back(sx);
2749 }
2750 }
2751
2752 ol.pushGeneratorState();
2754 if (!sl.empty())
2755 {
2756 ol.startLabels();
2757 size_t i=0;
2758 for (const auto &s : sl)
2759 {
2760 i++;
2761 ol.writeLabel(s,i==sl.size());
2762 }
2763 ol.endLabels();
2764 }
2765 ol.popGeneratorState();
2766}
2767
2769{
2770 ol.startContents();
2771
2772 QCString pageType = " ";
2773 pageType += compoundTypeString();
2774
2775 bool exampleFlag=hasExamples();
2776
2777 //---------------------------------------- start flexible part -------------------------------
2778
2779 SrcLangExt lang = getLanguage();
2780
2781 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
2782 {
2783 switch (lde->kind())
2784 {
2785 case LayoutDocEntry::BriefDesc:
2786 writeBriefDescription(ol,exampleFlag);
2787 break;
2788 case LayoutDocEntry::ClassIncludes:
2789 if (lang==SrcLangExt::Slice)
2790 {
2792 }
2793 else
2794 {
2796 }
2797 break;
2798 case LayoutDocEntry::ClassInheritanceGraph:
2800 break;
2801 case LayoutDocEntry::ClassCollaborationGraph:
2803 break;
2804 case LayoutDocEntry::ClassAllMembersLink:
2805 //writeAllMembersLink(ol); // this is now part of the summary links
2806 break;
2807 case LayoutDocEntry::MemberDeclStart:
2809 break;
2810 case LayoutDocEntry::MemberGroups:
2812 break;
2813 case LayoutDocEntry::MemberDecl:
2814 {
2815 ClassDefSet visitedClasses;
2816 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
2817 if (lmd)
2818 {
2819 writeMemberDeclarations(ol,visitedClasses,lmd->type,lmd->title(lang),lmd->subtitle(lang));
2820 }
2821 }
2822 break;
2823 case LayoutDocEntry::ClassNestedClasses:
2824 {
2825 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
2826 if (ls)
2827 {
2828 writeNestedClasses(ol,ls->title(lang));
2829 }
2830 }
2831 break;
2832 case LayoutDocEntry::MemberDeclEnd:
2834 break;
2835 case LayoutDocEntry::DetailedDesc:
2836 {
2837 const LayoutDocEntrySection *ls = dynamic_cast<const LayoutDocEntrySection*>(lde.get());
2838 if (ls)
2839 {
2840 writeDetailedDescription(ol,pageType,exampleFlag,ls->title(lang));
2841 }
2842 }
2843 break;
2844 case LayoutDocEntry::MemberDefStart:
2846 break;
2847 case LayoutDocEntry::ClassInlineClasses:
2849 break;
2850 case LayoutDocEntry::MemberDef:
2851 {
2852 const LayoutDocEntryMemberDef *lmd = dynamic_cast<const LayoutDocEntryMemberDef*>(lde.get());
2853 if (lmd)
2854 {
2855 writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
2856 }
2857 }
2858 break;
2859 case LayoutDocEntry::MemberDefEnd:
2861 break;
2862 case LayoutDocEntry::ClassUsedFiles:
2863 showUsedFiles(ol);
2864 break;
2865 case LayoutDocEntry::AuthorSection:
2867 break;
2868 case LayoutDocEntry::NamespaceNestedNamespaces:
2869 case LayoutDocEntry::NamespaceNestedConstantGroups:
2870 case LayoutDocEntry::NamespaceClasses:
2871 case LayoutDocEntry::NamespaceConcepts:
2872 case LayoutDocEntry::NamespaceInterfaces:
2873 case LayoutDocEntry::NamespaceStructs:
2874 case LayoutDocEntry::NamespaceExceptions:
2875 case LayoutDocEntry::NamespaceInlineClasses:
2876 case LayoutDocEntry::ConceptDefinition:
2877 case LayoutDocEntry::FileClasses:
2878 case LayoutDocEntry::FileConcepts:
2879 case LayoutDocEntry::FileInterfaces:
2880 case LayoutDocEntry::FileStructs:
2881 case LayoutDocEntry::FileExceptions:
2882 case LayoutDocEntry::FileNamespaces:
2883 case LayoutDocEntry::FileConstantGroups:
2884 case LayoutDocEntry::FileIncludes:
2885 case LayoutDocEntry::FileIncludeGraph:
2886 case LayoutDocEntry::FileIncludedByGraph:
2887 case LayoutDocEntry::FileSourceLink:
2888 case LayoutDocEntry::FileInlineClasses:
2889 case LayoutDocEntry::GroupClasses:
2890 case LayoutDocEntry::GroupConcepts:
2891 case LayoutDocEntry::GroupModules:
2892 case LayoutDocEntry::GroupInlineClasses:
2893 case LayoutDocEntry::GroupNamespaces:
2894 case LayoutDocEntry::GroupDirs:
2895 case LayoutDocEntry::GroupNestedGroups:
2896 case LayoutDocEntry::GroupFiles:
2897 case LayoutDocEntry::GroupGraph:
2898 case LayoutDocEntry::GroupPageDocs:
2899 case LayoutDocEntry::ModuleExports:
2900 case LayoutDocEntry::ModuleClasses:
2901 case LayoutDocEntry::ModuleConcepts:
2902 case LayoutDocEntry::ModuleUsedFiles:
2903 case LayoutDocEntry::DirSubDirs:
2904 case LayoutDocEntry::DirFiles:
2905 case LayoutDocEntry::DirGraph:
2906 err("Internal inconsistency: member '{}' should not be part of LayoutDocManager::Class entry list\n",lde->entryToString());
2907 break;
2908 }
2909 }
2910
2911 ol.endContents();
2912}
2913
2915{
2916 QCString pageTitle;
2917 SrcLangExt lang = getLanguage();
2918
2919 auto getReferenceTitle = [this](std::function<QCString()> translateFunc) -> QCString
2920 {
2921 return Config_getBool(HIDE_COMPOUND_REFERENCE) ? displayName() : translateFunc();
2922 };
2923
2924 if (lang==SrcLangExt::Fortran)
2925 {
2926 pageTitle = getReferenceTitle([this](){
2927 return theTranslator->trCompoundReferenceFortran(displayName(), m_compType, !m_tempArgs.empty());
2928 });
2929 }
2930 else if (lang==SrcLangExt::Slice)
2931 {
2932 pageTitle = getReferenceTitle([this](){
2933 return theTranslator->trCompoundReferenceSlice(displayName(), m_compType, isSliceLocal());
2934 });
2935 }
2936 else if (lang==SrcLangExt::VHDL)
2937 {
2938 pageTitle = getReferenceTitle([this](){
2939 return theTranslator->trCustomReference(VhdlDocGen::getClassTitle(this));
2940 });
2941 }
2942 else if (lang==SrcLangExt::CSharp && !m_primaryConstructorParams.empty())
2943 {
2944 pageTitle = getReferenceTitle([this](){
2946 m_compType,
2947 !m_tempArgs.empty());
2948 });
2949 }
2950 else if (isJavaEnum())
2951 {
2952 pageTitle = getReferenceTitle([this](){
2953 return theTranslator->trEnumReference(displayName());
2954 });
2955 }
2956 else if (m_compType==Service)
2957 {
2958 pageTitle = getReferenceTitle([this](){
2959 return theTranslator->trServiceReference(displayName());
2960 });
2961 }
2962 else if (m_compType==Singleton)
2963 {
2964 pageTitle = getReferenceTitle([this](){
2965 return theTranslator->trSingletonReference(displayName());
2966 });
2967 }
2968 else
2969 {
2970 pageTitle = getReferenceTitle([this](){
2971 return theTranslator->trCompoundReference(displayName(),
2972 m_compType == Interface && getLanguage()==SrcLangExt::ObjC ? Class : m_compType,
2973 !m_tempArgs.empty());
2974 });
2975 }
2976 return pageTitle;
2977}
2978
2979// write all documentation for this class
2981{
2982 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
2983 //bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
2984 //bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
2985 bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
2986 QCString pageTitle = title();
2987
2989 if (sliceOpt)
2990 {
2991 if (compoundType()==Interface)
2992 {
2994 }
2995 else if (compoundType()==Struct)
2996 {
2998 }
2999 else if (compoundType()==Exception)
3000 {
3002 }
3003 else
3004 {
3006 }
3007 }
3008 else
3009 {
3011 }
3012
3013 AUTO_TRACE("name='{}' getOutputFileBase='{}'",name(),getOutputFileBase());
3014 bool hasAllMembersLink=false;
3015 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
3016 {
3017 if (lde->kind()==LayoutDocEntry::ClassAllMembersLink)
3018 {
3019 hasAllMembersLink = true;
3020 break;
3021 }
3022 }
3023 QCString memListFile;
3024 if (hasAllMembersLink && !m_allMemberNameInfoLinkedMap.empty() && !Config_getBool(OPTIMIZE_OUTPUT_FOR_C))
3025 {
3026 memListFile = getMemberListFileName();
3027 }
3028 startFile(ol,getOutputFileBase(),false,name(),pageTitle,hli,!generateTreeView,QCString(),0,memListFile);
3029 if (!generateTreeView)
3030 {
3032 {
3034 }
3035 ol.endQuickIndices();
3036 }
3037
3038 startTitle(ol,getOutputFileBase(),this);
3039 ol.parseText(pageTitle);
3041 addGroupListToTitle(ol,this);
3043 writeDocumentationContents(ol,pageTitle);
3044
3045 endFileWithNavPath(ol,this);
3046
3047 if (Config_getBool(SEPARATE_MEMBER_PAGES))
3048 {
3049 writeMemberPages(ol);
3050 }
3051}
3052
3054{
3055 ///////////////////////////////////////////////////////////////////////////
3056 //// Member definitions on separate pages
3057 ///////////////////////////////////////////////////////////////////////////
3058
3059 ol.pushGeneratorState();
3061
3062 for (const auto &ml : m_memberLists)
3063 {
3064 if (ml->numDocMembers()>ml->numDocEnumValues() && ml->listType().isDetailed())
3065 {
3066 ml->writeDocumentationPage(ol,displayName(),this);
3067 }
3068 }
3069
3070 ol.popGeneratorState();
3071}
3072
3074{
3075 bool createSubDirs=Config_getBool(CREATE_SUBDIRS);
3076
3077 ol.writeString(" <div class=\"navtab\">\n");
3078 ol.writeString(" <table>\n");
3079
3080 for (auto &mni : m_allMemberNameInfoLinkedMap)
3081 {
3082 for (auto &mi : *mni)
3083 {
3084 const MemberDef *md=mi->memberDef();
3085 if (md->getClassDef()==this && md->isLinkable() && !md->isEnumValue())
3086 {
3087 if (md->isLinkableInProject())
3088 {
3089 if (md==currentMd) // selected item => highlight
3090 {
3091 ol.writeString(" <tr><td class=\"navtabHL\">");
3092 }
3093 else
3094 {
3095 ol.writeString(" <tr><td class=\"navtab\">");
3096 }
3097 ol.writeString("<span class=\"label\"><a ");
3098 ol.writeString("href=\"");
3099 if (createSubDirs) ol.writeString("../../");
3100 QCString url = md->getOutputFileBase();
3102 ol.writeString(url+"#"+md->anchor());
3103 ol.writeString("\">");
3104 ol.writeString(convertToHtml(md->name()));
3105 ol.writeString("</a></span>");
3106 ol.writeString("</td></tr>\n");
3107 }
3108 }
3109 }
3110 }
3111
3112 ol.writeString(" </table>\n");
3113 ol.writeString(" </div>\n");
3114}
3115
3116
3117
3119{
3120 // write inner classes after the parent, so the tag files contain
3121 // the definition in proper order!
3122 for (const auto &innerCd : m_innerClasses)
3123 {
3124 if (
3125 innerCd->isLinkableInProject() && !innerCd->isImplicitTemplateInstance() &&
3126 protectionLevelVisible(innerCd->protection()) &&
3127 !innerCd->isEmbeddedInOuterScope()
3128 )
3129 {
3130 msg("Generating docs for nested compound {}...\n",innerCd->displayName());
3131 innerCd->writeDocumentation(ol);
3132 innerCd->writeMemberList(ol);
3133 }
3134 innerCd->writeDocumentationForInnerClasses(ol);
3135 }
3136}
3137
3138// write the list of all (inherited) members for this class
3140{
3141 bool cOpt = Config_getBool(OPTIMIZE_OUTPUT_FOR_C);
3142 //bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
3143 bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
3144 bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
3145 if (m_allMemberNameInfoLinkedMap.empty() || cOpt) return;
3146 // only for HTML
3147 ol.pushGeneratorState();
3149
3151 if (sliceOpt)
3152 {
3153 if (compoundType()==Interface)
3154 {
3156 }
3157 else if (compoundType()==Struct)
3158 {
3160 }
3161 else if (compoundType()==Exception)
3162 {
3164 }
3165 else
3166 {
3168 }
3169 }
3170 else
3171 {
3173 }
3174
3175 QCString memListFile = getMemberListFileName();
3176 startFile(ol,memListFile,false,memListFile,theTranslator->trMemberList(),hli,!generateTreeView,getOutputFileBase());
3177 if (!generateTreeView)
3178 {
3180 {
3182 }
3183 ol.endQuickIndices();
3184 }
3185 startTitle(ol,QCString());
3186 ol.parseText(displayName()+" "+theTranslator->trMemberList());
3187 endTitle(ol,QCString(),QCString());
3188 ol.startContents();
3189 ol.startParagraph();
3190 ol.parseText(theTranslator->trThisIsTheListOfAllMembers());
3191 ol.docify(" ");
3193 ol.parseText(theTranslator->trIncludingInheritedMembers());
3194 ol.endParagraph();
3195
3196 //ol.startItemList();
3197
3198 bool first = true; // to prevent empty table
3199 int idx=0;
3200 for (auto &mni : m_allMemberNameInfoLinkedMap)
3201 {
3202 for (auto &mi : *mni)
3203 {
3204 const MemberDef *md=mi->memberDef();
3205 const ClassDef *cd=md->getClassDef();
3206 Protection prot = mi->prot();
3207 Specifier virt=md->virtualness();
3208
3209 //printf("%s: Member %s of class %s md->protection()=%d mi->prot=%d prot=%d inherited=%d\n",
3210 // qPrint(name()),qPrint(md->name()),qPrint(cd->name()),md->protection(),mi->prot,prot,mi->inherited);
3211
3212 if (cd && !md->name().isEmpty() && !md->isAnonymous())
3213 {
3214 bool memberWritten=FALSE;
3215 if (cd->isLinkable() && md->isLinkable())
3216 // create a link to the documentation
3217 {
3218 QCString name=mi->ambiguityResolutionScope()+md->name();
3219 //ol.writeListItem();
3220 if (first)
3221 {
3222 ol.writeString("<table class=\"directory\">\n");
3223 first = false;
3224 }
3225 ol.writeString(" <tr");
3226 if ((idx&1)==0) ol.writeString(" class=\"even\""); else ol.writeString(" class=\"odd\"");
3227 idx++;
3228 ol.writeString("><td class=\"entry\">");
3229 if (cd->isObjectiveC())
3230 {
3231 if (md->isObjCMethod())
3232 {
3233 if (md->isStatic())
3234 ol.writeString("+&#160;</td><td>");
3235 else
3236 ol.writeString("-&#160;</td><td>");
3237 }
3238 else
3239 ol.writeString("</td><td class=\"entry\">");
3240 }
3241 if (md->isObjCMethod())
3242 {
3244 md->getOutputFileBase(),
3245 md->anchor(),md->name());
3246 }
3247 else
3248 {
3249 //Definition *bd = md->getGroupDef();
3250 //if (bd==nullptr) bd=cd;
3252 md->getOutputFileBase(),
3253 md->anchor(),name);
3254
3255 if ( md->isFunction() || md->isSignal() || md->isSlot() ||
3256 (md->isFriend() && !md->argsString().isEmpty()))
3257 ol.docify(md->argsString());
3258 else if (md->isEnumerate())
3259 ol.parseText(" "+theTranslator->trEnumName());
3260 else if (md->isEnumValue())
3261 ol.parseText(" "+theTranslator->trEnumValue());
3262 else if (md->isTypedef())
3263 ol.docify(" typedef");
3264 else if (md->isFriend() && md->typeString()=="friend class")
3265 ol.docify(" class");
3266 //ol.writeString("\n");
3267 }
3268 ol.writeString("</td>");
3269 memberWritten=TRUE;
3270 }
3271 else if (!cd->isArtificial() &&
3272 !Config_getBool(HIDE_UNDOC_MEMBERS) &&
3274 ) // no documentation,
3275 // generate link to the class instead.
3276 {
3277 //ol.writeListItem();
3278 if (first)
3279 {
3280 ol.writeString("<table class=\"directory\">\n");
3281 first = false;
3282 }
3283 ol.writeString(" <tr bgcolor=\"#f0f0f0\"");
3284 if ((idx&1)==0) ol.writeString(" class=\"even\""); else ol.writeString(" class=\"odd\"");
3285 idx++;
3286 ol.writeString("><td class=\"entry\">");
3287 if (cd->isObjectiveC())
3288 {
3289 if (md->isObjCMethod())
3290 {
3291 if (md->isStatic())
3292 ol.writeString("+&#160;</td><td class=\"entry\">");
3293 else
3294 ol.writeString("-&#160;</td><td class=\"entry\">");
3295 }
3296 else
3297 ol.writeString("</td><td class=\"entry\">");
3298 }
3299 ol.startBold();
3300 ol.docify(md->name());
3301 ol.endBold();
3302 if (!md->isObjCMethod())
3303 {
3304 if ( md->isFunction() || md->isSignal() || md->isSlot() )
3305 ol.docify(md->argsString());
3306 else if (md->isEnumerate())
3307 ol.parseText(" "+theTranslator->trEnumName());
3308 else if (md->isEnumValue())
3309 ol.parseText(" "+theTranslator->trEnumValue());
3310 else if (md->isTypedef())
3311 ol.docify(" typedef");
3312 }
3313 ol.writeString(" (");
3314 ol.parseText(theTranslator->trDefinedIn()+" ");
3315 if (cd->isLinkable())
3316 {
3317 ol.writeObjectLink(
3318 cd->getReference(),
3319 cd->getOutputFileBase(),
3320 cd->anchor(),
3321 cd->displayName());
3322 }
3323 else
3324 {
3325 ol.startBold();
3326 ol.docify(cd->displayName());
3327 ol.endBold();
3328 }
3329 ol.writeString(")");
3330 ol.writeString("</td>");
3331 memberWritten=TRUE;
3332 }
3333 if (memberWritten)
3334 {
3335 ol.writeString("<td class=\"entry\">");
3337 cd->getOutputFileBase(),
3338 cd->anchor(),
3339 md->category() ?
3340 md->category()->displayName() :
3341 cd->displayName());
3342 ol.writeString("</td>");
3343 ol.writeString("<td class=\"entry\">");
3344 }
3345 SrcLangExt lang = md->getLanguage();
3346 if (
3347 (prot!=Protection::Public || (virt!=Specifier::Normal && getLanguage()!=SrcLangExt::ObjC) ||
3348 md->isFriend() || md->isRelated() || md->isExplicit() ||
3349 md->isMutable() || (md->isInline() && Config_getBool(INLINE_INFO)) ||
3350 md->isSignal() || md->isSlot() || md->isThreadLocal() ||
3351 (getLanguage()==SrcLangExt::IDL &&
3352 (md->isOptional() || md->isAttribute() || md->isUNOProperty())) ||
3353 md->isStatic() || lang==SrcLangExt::VHDL
3354 )
3355 && memberWritten)
3356 {
3357 StringVector sl;
3358 if (lang==SrcLangExt::VHDL)
3359 {
3360 sl.push_back(theTranslator->trVhdlType(md->getVhdlSpecifiers(),TRUE).str()); //append vhdl type
3361 }
3362 else if (md->isFriend()) sl.emplace_back("friend");
3363 else if (md->isRelated()) sl.emplace_back("related");
3364 else
3365 {
3366 if (Config_getBool(INLINE_INFO) && md->isInline())
3367 sl.emplace_back("inline");
3368 if (md->isExplicit()) sl.emplace_back("explicit");
3369 if (md->isMutable()) sl.emplace_back("mutable");
3370 if (md->isThreadLocal()) sl.emplace_back("thread_local");
3371 if (prot==Protection::Protected) sl.emplace_back("protected");
3372 else if (prot==Protection::Private) sl.emplace_back("private");
3373 else if (prot==Protection::Package) sl.emplace_back("package");
3374 if (virt==Specifier::Virtual && getLanguage()!=SrcLangExt::ObjC)
3375 sl.emplace_back("virtual");
3376 else if (virt==Specifier::Pure) sl.emplace_back("pure virtual");
3377 if (md->isStatic()) sl.emplace_back("static");
3378 if (md->isSignal()) sl.emplace_back("signal");
3379 if (md->isSlot()) sl.emplace_back("slot");
3380// this is the extra member page
3381 if (md->isOptional()) sl.emplace_back("optional");
3382 if (md->isAttribute()) sl.emplace_back("attribute");
3383 if (md->isUNOProperty()) sl.emplace_back("property");
3384 if (md->isReadonly()) sl.emplace_back("readonly");
3385 if (md->isBound()) sl.emplace_back("bound");
3386 if (md->isRemovable()) sl.emplace_back("removable");
3387 if (md->isConstrained()) sl.emplace_back("constrained");
3388 if (md->isTransient()) sl.emplace_back("transient");
3389 if (md->isMaybeVoid()) sl.emplace_back("maybevoid");
3390 if (md->isMaybeDefault()) sl.emplace_back("maybedefault");
3391 if (md->isMaybeAmbiguous()) sl.emplace_back("maybeambiguous");
3392 }
3393 bool firstSpan=true;
3394 for (const auto &s : sl)
3395 {
3396 if (!firstSpan)
3397 {
3398 ol.writeString("</span><span class=\"mlabel\">");
3399 }
3400 else
3401 {
3402 ol.writeString("<span class=\"mlabel\">");
3403 firstSpan=false;
3404 }
3405 ol.docify(s);
3406 }
3407 if (!firstSpan) ol.writeString("</span>");
3408 }
3409 if (memberWritten)
3410 {
3411 ol.writeString("</td>");
3412 ol.writeString("</tr>\n");
3413 }
3414 }
3415 }
3416 }
3417 //ol.endItemList();
3418
3419 if (!first) ol.writeString("</table>");
3420
3421 endFile(ol);
3422 ol.popGeneratorState();
3423}
3424
3425// add a reference to an example
3426bool ClassDefImpl::addExample(const QCString &anchor,const QCString &nameStr, const QCString &file)
3427{
3428 return m_examples.inSort(Example(anchor,nameStr,file));
3429}
3430
3431// returns TRUE if this class is used in an example
3433{
3434 return !m_examples.empty();
3435}
3436
3437void ClassDefImpl::addTypeConstraint(const QCString &typeConstraint,const QCString &type)
3438{
3439 //printf("addTypeConstraint(%s,%s)\n",qPrint(type),qPrint(typeConstraint));
3440 bool hideUndocRelation = Config_getBool(HIDE_UNDOC_RELATIONS);
3441 if (typeConstraint.isEmpty() || type.isEmpty()) return;
3442 SymbolResolver resolver(getFileDef());
3443 ClassDefMutable *cd = resolver.resolveClassMutable(this,typeConstraint);
3444 if (cd==nullptr && !hideUndocRelation)
3445 {
3446 cd = toClassDefMutable(
3447 Doxygen::hiddenClassLinkedMap->add(typeConstraint,
3448 std::unique_ptr<ClassDef>(
3449 new ClassDefImpl(
3451 getDefColumn(),
3452 typeConstraint,
3453 ClassDef::Class))));
3454 if (cd)
3455 {
3456 cd->setUsedOnly(TRUE);
3457 cd->setLanguage(getLanguage());
3458 //printf("Adding undocumented constraint '%s' to class %s on type %s\n",
3459 // qPrint(typeConstraint),qPrint(name()),qPrint(type));
3460 }
3461 }
3462 if (cd)
3463 {
3464 auto it = std::find_if(m_constraintClassList.begin(),
3466 [&cd](const auto &ccd) { return ccd.classDef==cd; });
3467
3468 if (it==m_constraintClassList.end())
3469 {
3470 m_constraintClassList.emplace_back(cd);
3471 it = m_constraintClassList.end()-1;
3472 }
3473 (*it).addAccessor(type);
3474 //printf("Adding constraint '%s' to class %s on type %s\n",
3475 // qPrint(typeConstraint),qPrint(name()),qPrint(type));
3476 }
3477}
3478
3479// Java Type Constrains: A<T extends C & I>
3481{
3482 for (const Argument &a : m_tempArgs)
3483 {
3484 if (!a.typeConstraint.isEmpty())
3485 {
3486 QCString typeConstraint;
3487 int i=0,p=0;
3488 while ((i=a.typeConstraint.find('&',p))!=-1) // typeConstraint="A &I" for C<T extends A & I>
3489 {
3490 typeConstraint = a.typeConstraint.mid(p,i-p).stripWhiteSpace();
3491 addTypeConstraint(typeConstraint,a.type);
3492 p=i+1;
3493 }
3494 typeConstraint = a.typeConstraint.right(a.typeConstraint.length()-p).stripWhiteSpace();
3495 addTypeConstraint(typeConstraint,a.type);
3496 }
3497 }
3498}
3499
3500// C# Type Constraints: D<T> where T : C, I
3505
3507{
3508 m_tempArgs = al;
3509}
3510
3511static bool hasNonReferenceSuperClassRec(const ClassDef *cd,int level)
3512{
3513 bool found=!cd->isReference() && cd->isLinkableInProject() && !cd->isHidden();
3514 if (found)
3515 {
3516 return TRUE; // we're done if this class is not a reference
3517 }
3518 for (const auto &ibcd : cd->subClasses())
3519 {
3520 const ClassDef *bcd=ibcd.classDef;
3521 if (level>256)
3522 {
3523 err("Possible recursive class relation while inside {} and looking for base class {}\n",cd->name(),bcd->name());
3524 return FALSE;
3525 }
3526 // recurse into the super class branch
3527 found = found || hasNonReferenceSuperClassRec(bcd,level+1);
3528 if (!found)
3529 {
3530 // look for template instances that might have non-reference super classes
3531 for (const auto &cil : bcd->getTemplateInstances())
3532 {
3533 // recurse into the template instance branch
3534 found = hasNonReferenceSuperClassRec(cil.classDef,level+1);
3535 if (found) break;
3536 }
3537 }
3538 else
3539 {
3540 break;
3541 }
3542 }
3543 return found;
3544}
3545
3546/*! Returns \c TRUE iff this class or a class inheriting from this class
3547 * is \e not defined in an external tag file.
3548 */
3550{
3551 return hasNonReferenceSuperClassRec(this,0);
3552}
3553
3558
3560{
3561 m_requiresClause = req;
3562}
3563
3568
3569/*! a link to this class is possible within this project */
3571{
3572 bool extractLocal = Config_getBool(EXTRACT_LOCAL_CLASSES);
3573 bool extractStatic = Config_getBool(EXTRACT_STATIC);
3574 bool hideUndoc = Config_getBool(HIDE_UNDOC_CLASSES);
3576 {
3577 return m_templateMaster->isLinkableInProject();
3578 }
3579 else
3580 {
3581 //printf("%s::isLinkableInProject() conditions: artificial=%d hidden=%d anonymous=%d protection=%d local=%d docs=%d static=%d ref=%d\n",
3582 // qPrint(name()),
3583 // !isArtificial(),
3584 // !isHidden(),
3585 // !isAnonymous(),
3586 // protectionLevelVisible(m_prot),
3587 // !m_isLocal || extractLocal,
3588 // hasDocumentation() || m_tempArgs.hasTemplateDocumentation() || !hideUndoc,
3589 // !m_isStatic || extractStatic,
3590 // !isReference());
3591 return
3592 !isArtificial() && !isHidden() && /* not hidden */
3593 !isAnonymous() && /* not anonymous */
3594 protectionLevelVisible(m_prot) && /* private/internal */
3595 (!m_isLocal || extractLocal) && /* local */
3596 (hasDocumentation() || m_tempArgs.hasTemplateDocumentation() || !hideUndoc) && /* documented */
3597 (!m_isStatic || extractStatic) && /* static */
3598 !isReference(); /* not an external reference */
3599 }
3600}
3601
3603{
3605 {
3606 return m_templateMaster->isLinkable();
3607 }
3608 else
3609 {
3610 return isReference() || isLinkableInProject();
3611 }
3612}
3613
3614
3615/*! the class is visible in a class diagram, or class hierarchy */
3617{
3618 bool allExternals = Config_getBool(ALLEXTERNALS);
3619 bool hideUndocClasses = Config_getBool(HIDE_UNDOC_CLASSES);
3620 bool extractStatic = Config_getBool(EXTRACT_STATIC);
3621
3622 //printf("%s: isArtificial=%d isAnonymous=%d protectionLevelVisible=%d hasDocumentation=%d templateInstance=%d static=%d\n",
3623 // qPrint(name()),
3624 // (allExternals && !isArtificial()) || hasNonReferenceSuperClass(),
3625 // !isAnonymous(),
3626 // protectionLevelVisible(m_prot),
3627 // (hasDocumentation() || !hideUndocClasses || (m_templateMaster && m_templateMaster->hasDocumentation()) || isReference()),
3628 // !m_implicitTemplateInstance || !m_inherits.empty() || !m_inheritedBy.empty(),
3629 // !m_isStatic || extractStatic);
3630
3631 return // show all classes or a subclass is visible
3632 ((allExternals && !isArtificial()) || hasNonReferenceSuperClass()) &&
3633 // and not an anonymous compound
3634 !isAnonymous() &&
3635 // and not privately inherited
3637 // documented or shown anyway or documentation is external
3638 (hasDocumentation() ||
3639 !hideUndocClasses ||
3640 (m_templateMaster && m_templateMaster->hasDocumentation()) ||
3641 isReference()
3642 ) &&
3643 // if this is an implicit template instance then it most be part of the inheritance hierarchy
3644 (!m_implicitTemplateInstance || !m_inherits.empty() || !m_inheritedBy.empty()) &&
3645 // is not part of an unnamed namespace or shown anyway
3646 (!m_isStatic || extractStatic);
3647}
3648
3653
3654//----------------------------------------------------------------------
3655// recursive function:
3656// returns the distance to the base class definition 'bcd' represents an (in)direct base
3657// class of class definition 'cd' or nullptr if it does not.
3658
3659int ClassDefImpl::isBaseClass(const ClassDef *bcd, bool followInstances,const QCString &templSpec) const
3660{
3661 int distance=0;
3662 //printf("isBaseClass(cd=%s) looking for %s templSpec=%s\n",qPrint(name()),qPrint(bcd->name()),qPrint(templSpec));
3663 for (const auto &bclass : baseClasses())
3664 {
3665 const ClassDef *ccd = bclass.classDef;
3666 if (!followInstances && ccd->templateMaster())
3667 {
3668 ccd=ccd->templateMaster();
3669 }
3670 if (ccd==bcd && (templSpec.isEmpty() || templSpec==bclass.templSpecifiers))
3671 {
3672 distance=1;
3673 break; // no shorter path possible
3674 }
3675 else
3676 {
3677 int d = ccd->isBaseClass(bcd,followInstances,templSpec);
3678 if (d>256)
3679 {
3680 err("Possible recursive class relation while inside {} and looking for base class {}\n",name(),bcd->name());
3681 return 0;
3682 }
3683 else if (d>0) // path found
3684 {
3685 if (distance==0 || d+1<distance) // update if no path found yet or shorter path found
3686 {
3687 distance=d+1;
3688 }
3689 }
3690 }
3691 }
3692 return distance;
3693}
3694
3695//----------------------------------------------------------------------
3696
3697bool ClassDefImpl::isSubClass(ClassDef *cd,int level) const
3698{
3699 bool found=FALSE;
3700 if (level>256)
3701 {
3702 err("Possible recursive class relation while inside {} and looking for derived class {}\n",name(),cd->name());
3703 return FALSE;
3704 }
3705 for (const auto &iscd : subClasses())
3706 {
3707 ClassDef *ccd=iscd.classDef;
3708 found = (ccd==cd) || ccd->isSubClass(cd,level+1);
3709 if (found) break;
3710 }
3711 return found;
3712}
3713
3714//----------------------------------------------------------------------------
3715
3716static bool isStandardFunc(const MemberDef *md)
3717{
3718 return md->name()=="operator=" || // assignment operator
3719 md->isConstructor() || // constructor
3720 md->isDestructor(); // destructor
3721}
3722
3723void ClassDefImpl::mergeMembersFromBaseClasses(bool mergeVirtualBaseClass)
3724{
3725 SrcLangExt lang = getLanguage();
3727 size_t sepLen = sep.length();
3728 bool inlineInheritedMembers = Config_getBool(INLINE_INHERITED_MEMB);
3729 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
3730
3731 //printf(" mergeMembers for %s mergeVirtualBaseClass=%d\n",qPrint(name()),mergeVirtualBaseClass);
3732 // the merge the base members with this class' members
3733 for (const auto &bcd : baseClasses())
3734 {
3735 ClassDefMutable *bClass=toClassDefMutable(bcd.classDef);
3736 if (bClass)
3737 {
3738 const MemberNameInfoLinkedMap &srcMnd = bClass->memberNameInfoLinkedMap();
3740
3741 for (auto &srcMni : srcMnd)
3742 {
3743 MemberNameInfo *dstMni=dstMnd.find(srcMni->memberName());
3744 if (dstMni)
3745 // a member with that name is already in the class.
3746 // the member may hide or reimplement the one in the sub class
3747 // or there may be another path to the base class that is already
3748 // visited via another branch in the class hierarchy.
3749 {
3750 //printf(" %s hides member name %s\n",qPrint(bClass->name()),qPrint(srcMni->memberName()));
3751 for (auto &srcMi : *srcMni)
3752 {
3753 MemberDef *srcMd = srcMi->memberDef();
3754 bool found=FALSE;
3755 bool ambiguous=FALSE;
3756 bool hidden=FALSE;
3757 const ClassDef *srcCd = srcMd->getClassDef();
3758 for (auto &dstMi : *dstMni)
3759 {
3760 const MemberDef *dstMd = dstMi->memberDef();
3761 if (srcMd!=dstMd) // different members
3762 {
3763 const ClassDef *dstCd = dstMd->getClassDef();
3764 //printf(" Is %s a base class of %s?\n",qPrint(srcCd->name()),qPrint(dstCd->name()));
3765 if (srcCd==dstCd || dstCd->isBaseClass(srcCd,TRUE))
3766 // member is in the same or a base class
3767 {
3768 const ArgumentList &srcAl = srcMd->argumentList();
3769 const ArgumentList &dstAl = dstMd->argumentList();
3770 found=matchArguments2(
3771 srcMd->getOuterScope(),srcMd->getFileDef(),srcMd->typeString(),&srcAl,
3772 dstMd->getOuterScope(),dstMd->getFileDef(),dstMd->typeString(),&dstAl,
3773 TRUE,lang
3774 );
3775 //printf(" Yes, matching (%s<->%s): %d\n",
3776 // qPrint(argListToString(srcMd->argumentList())),
3777 // qPrint(argListToString(dstMd->argumentList())),
3778 // found);
3779 hidden = hidden || !found;
3780 }
3781 else // member is in a non base class => multiple inheritance
3782 // using the same base class.
3783 {
3784 //printf(" $$ Existing member %s %s add scope %s\n",
3785 // qPrint(dstMi->ambiguityResolutionScope()),
3786 // qPrint(dstMd->name()),
3787 // qPrint(dstMi->scopePath().left(dstMi->scopePath().find("::")+2)));
3788
3789 QCString scope=dstMi->scopePath().left(dstMi->scopePath().find(sep)+sepLen);
3790 if (scope!=dstMi->ambiguityResolutionScope().left(scope.length()))
3791 {
3792 dstMi->setAmbiguityResolutionScope(scope+dstMi->ambiguityResolutionScope());
3793 }
3794 ambiguous=TRUE;
3795 }
3796 }
3797 else // same members
3798 {
3799 // do not add if base class is virtual or
3800 // if scope paths are equal or
3801 // if base class is an interface (and thus implicitly virtual).
3802 //printf(" same member found srcMi->virt=%d dstMi->virt=%d\n",srcMi->virt(),dstMi->virt());
3803 if ((srcMi->virt()!=Specifier::Normal && dstMi->virt()!=Specifier::Normal) ||
3804 bClass->name()+sep+srcMi->scopePath() == dstMi->scopePath() ||
3806 )
3807 {
3808 found=TRUE;
3809 }
3810 else // member can be reached via multiple paths in the
3811 // inheritance tree
3812 {
3813 //printf(" $$ Existing member %s %s add scope %s\n",
3814 // qPrint(dstMi->ambiguityResolutionScope()),
3815 // qPrint(dstMd->name()),
3816 // qPrint(dstMi->scopePath().left(dstMi->scopePath().find("::")+2)));
3817
3818 QCString scope=dstMi->scopePath().left(dstMi->scopePath().find(sep)+sepLen);
3819 if (scope!=dstMi->ambiguityResolutionScope().left(scope.length()))
3820 {
3821 dstMi->setAmbiguityResolutionScope(dstMi->ambiguityResolutionScope()+scope);
3822 }
3823 ambiguous=TRUE;
3824 }
3825 }
3826 if (found) break;
3827 }
3828 //printf(" member %s::%s hidden %d ambiguous %d srcMi->ambigClass=%p found=%d\n",
3829 // qPrint(srcCd->name()),qPrint(srcMd->name()),hidden,ambiguous,
3830 // (void*)srcMi->ambigClass(),found);
3831
3832 // TODO: fix the case where a member is hidden by inheritance
3833 // of a member with the same name but with another prototype,
3834 // while there is more than one path to the member in the
3835 // base class due to multiple inheritance. In this case
3836 // it seems that the member is not reachable by prefixing a
3837 // scope name either (according to my compiler). Currently,
3838 // this case is shown anyway.
3839 if (!found && srcMd->protection()!=Protection::Private && !srcMd->isFriend() &&
3840 srcMi->virtualBaseClass()==mergeVirtualBaseClass && lang!=SrcLangExt::Python)
3841 {
3842 Protection prot = srcMd->protection();
3843 if (bcd.prot==Protection::Protected && prot==Protection::Public)
3844 {
3845 prot = bcd.prot;
3846 }
3847 else if (bcd.prot==Protection::Private)
3848 {
3849 prot = bcd.prot;
3850 }
3851
3852 if (inlineInheritedMembers)
3853 {
3854 if (!isStandardFunc(srcMd))
3855 {
3856 //printf(" %s::insertMember(%s)\n",qPrint(name()),qPrint(srcMd->name()));
3857 internalInsertMember(srcMd,prot,FALSE);
3858 }
3859 }
3860
3861 Specifier virt=srcMi->virt();
3862 if (virt==Specifier::Normal && bcd.virt!=Specifier::Normal) virt=bcd.virt;
3863 bool virtualBaseClass = bcd.virt!=Specifier::Normal;
3864
3865 auto newMi = std::make_unique<MemberInfo>(srcMd,prot,virt,TRUE,virtualBaseClass);
3866 newMi->setScopePath(bClass->name()+sep+srcMi->scopePath());
3867 if (ambiguous)
3868 {
3869 //printf("$$ New member %s %s add scope %s::\n",
3870 // qPrint(srcMi->ambiguityResolutionScope),
3871 // qPrint(srcMd->name()),
3872 // qPrint(bClass->name()));
3873
3874 QCString scope=bClass->name()+sep;
3875 if (scope!=srcMi->ambiguityResolutionScope().left(scope.length()))
3876 {
3877 newMi->setAmbiguityResolutionScope(scope+srcMi->ambiguityResolutionScope());
3878 }
3879 }
3880 if (hidden)
3881 {
3882 if (srcMi->ambigClass()==nullptr)
3883 {
3884 newMi->setAmbigClass(bClass);
3885 newMi->setAmbiguityResolutionScope(bClass->name()+sep);
3886 }
3887 else
3888 {
3889 newMi->setAmbigClass(srcMi->ambigClass());
3890 newMi->setAmbiguityResolutionScope(srcMi->ambigClass()->name()+sep);
3891 }
3892 }
3893 dstMni->push_back(std::move(newMi));
3894 }
3895 }
3896 }
3897 else // base class has a member that is not in the sub class => copy
3898 {
3899 //printf(" %s adds member name %s\n",qPrint(bClass->name()),qPrint(srcMni->memberName()));
3900 // create a deep copy of the list (only the MemberInfo's will be
3901 // copied, not the actual MemberDef's)
3902 MemberNameInfo *newMni = dstMnd.add(srcMni->memberName());
3903
3904 // copy the member(s) from the base to the sub class
3905 for (auto &mi : *srcMni)
3906 {
3907 if (mi->virtualBaseClass()==mergeVirtualBaseClass && !mi->memberDef()->isFriend()) // don't inherit friends
3908 {
3909 Protection prot = mi->prot();
3910 if (bcd.prot==Protection::Protected)
3911 {
3912 if (prot==Protection::Public) prot=Protection::Protected;
3913 }
3914 else if (bcd.prot==Protection::Private)
3915 {
3916 prot=Protection::Private;
3917 }
3918 Specifier virt=mi->virt();
3919 bool virtualBaseClass = bcd.virt!=Specifier::Normal || mi->virtualBaseClass();
3920 if (virt==Specifier::Normal && bcd.virt!=Specifier::Normal) virt=bcd.virt;
3921 //printf(" %s::%s: [mi.prot=%d, bcd.prot=%d => prot=%d], [mi.virt=%d, bcd.virt=%d => virt=%d] virtualBase=%d\n",
3922 // qPrint(name()),qPrint(mi->memberDef()->name()),
3923 // mi->prot(),bcd.prot,prot,
3924 // mi->virt(),bcd.virt,virt,
3925 // virtualBaseClass
3926 // );
3927
3928 if (prot!=Protection::Private || extractPrivate)
3929 {
3930
3931 if (inlineInheritedMembers)
3932 {
3933 if (!isStandardFunc(mi->memberDef()))
3934 {
3935 //printf(" %s::insertMember '%s'\n",qPrint(name()),qPrint(mi->memberDef()->name()));
3936 internalInsertMember(mi->memberDef(),prot,FALSE);
3937 }
3938 }
3939 //printf("Adding!\n");
3940 std::unique_ptr<MemberInfo> newMi = std::make_unique<MemberInfo>(mi->memberDef(),prot,virt,TRUE,virtualBaseClass);
3941 newMi->setScopePath(bClass->name()+sep+mi->scopePath());
3942 newMi->setAmbigClass(mi->ambigClass());
3943 newMi->setAmbiguityResolutionScope(mi->ambiguityResolutionScope());
3944 newMni->push_back(std::move(newMi));
3945 }
3946 }
3947 }
3948 }
3949 }
3950 }
3951 }
3952}
3953
3954// See issue11260, referring to a variable in a base class will make doxygen
3955// add it as a member to the derived class, but this is not correct for non-private variables
3956// so we correct this here, now we know the inheritance hierarchy
3958{
3959 //printf("hideDerivedVariableInPython()\n");
3960 if (bClass)
3961 {
3962 const MemberNameInfoLinkedMap &srcMnd = bClass->memberNameInfoLinkedMap();
3964
3965 // recurse up the inheritance hierarchy
3966 for (const auto &bcd : bClass->baseClasses())
3967 {
3969 }
3970
3971 for (auto &srcMni : srcMnd) // for each member in a base class
3972 {
3973 //printf(" candidate(%s)\n",qPrint(srcMni->memberName()));
3974 MemberNameInfo *dstMni=dstMnd.find(srcMni->memberName());
3975 if (dstMni) // that is also in this class
3976 {
3978 //printf("%s member in %s and %s\n",qPrint(name()),qPrint(bClass->name()),qPrint(name()));
3979 for (it=dstMni->begin();it!=dstMni->end();)
3980 {
3981 MemberDefMutable *dstMd = toMemberDefMutable((*it)->memberDef());
3982 if (dstMd && dstMd->isVariable() && !dstMd->name().startsWith("__"))
3983 {
3984 //printf(" hiding member %s\n",qPrint(dstMd->name()));
3985 // hide a member variable if it is already defined in a base class, unless
3986 // it is a __private variable
3987 removeMemberFromLists(dstMd);
3988 it = dstMni->erase(it);
3989 }
3990 else
3991 {
3992 ++it;
3993 }
3994 }
3995 if (dstMni->empty()) // if the list has become empty, remove the entry from the dictionary
3996 {
3997 dstMnd.del(srcMni->memberName());
3998 }
3999 }
4000 }
4001 }
4002}
4003
4004/*!
4005 * recursively merges the 'all members' lists of a class base
4006 * with that of this class. Must only be called for classes without
4007 * subclasses!
4008 */
4010{
4011 if (m_membersMerged) return;
4012 if (getLanguage()==SrcLangExt::Python)
4013 {
4014 for (const auto &bcd : baseClasses())
4015 {
4016 ClassDefMutable *bClass=toClassDefMutable(bcd.classDef);
4018 }
4019 }
4020
4021 //printf("> %s::mergeMembers()\n",qPrint(name()));
4022
4024
4025 // first merge the members of the base class recursively
4026 for (const auto &bcd : baseClasses())
4027 {
4028 ClassDefMutable *bClass=toClassDefMutable(bcd.classDef);
4029 if (bClass)
4030 {
4031 // merge the members in the base class of this inheritance branch first
4032 bClass->mergeMembers();
4033 }
4034 }
4035
4036 // first merge the member that are not inherited via a virtual base class
4037 // (as this can end up reimplemented via multiple paths, see #10717 for examples)
4039 // then process the member that are inherited via a virtual base class to add the
4040 // ones that are not reimplemented via any path
4042
4043 //printf("< %s::mergeMembers()\n",qPrint(name()));
4044}
4045
4046//----------------------------------------------------------------------------
4047
4048/*! Merges the members of a Objective-C category into this class.
4049 */
4051{
4052 AUTO_TRACE();
4053 ClassDefMutable *category = toClassDefMutable(cat);
4054 if (category)
4055 {
4056 bool extractLocalMethods = Config_getBool(EXTRACT_LOCAL_METHODS);
4057 bool makePrivate = category->isLocal();
4058 // in case extract local methods is not enabled we don't add the methods
4059 // of the category in case it is defined in the .m file.
4060 if (makePrivate && !extractLocalMethods) return;
4061 bool isExtension = category->isExtension();
4062
4063 category->setCategoryOf(this);
4064 if (isExtension)
4065 {
4066 category->setArtificial(TRUE);
4067
4068 // copy base classes/protocols from extension
4069 for (const auto &bcd : category->baseClasses())
4070 {
4071 insertBaseClass(bcd.classDef,bcd.usedName,bcd.prot,bcd.virt,bcd.templSpecifiers);
4072 // correct bcd.classDef so that they do no longer derive from
4073 // category, but from this class!
4074 BaseClassList scl = bcd.classDef->subClasses();
4075 for (auto &scd : scl)
4076 {
4077 if (scd.classDef==category)
4078 {
4079 scd.classDef=this;
4080 }
4081 }
4082 bcd.classDef->updateSubClasses(scl);
4083 }
4084 }
4085 // make methods private for categories defined in the .m file
4086 //printf("%s::mergeCategory makePrivate=%d\n",qPrint(name()),makePrivate);
4087
4088 const MemberNameInfoLinkedMap &srcMnd = category->memberNameInfoLinkedMap();
4090
4091 for (auto &srcMni : srcMnd)
4092 {
4093 MemberNameInfo *dstMni=dstMnd.find(srcMni->memberName());
4094 if (dstMni) // method is already defined in the class
4095 {
4096 AUTO_TRACE_ADD("Existing member {}",srcMni->memberName());
4097 const auto &dstMi = dstMni->front();
4098 const auto &srcMi = srcMni->front();
4099 if (srcMi && dstMi)
4100 {
4101 MemberDefMutable *smdm = toMemberDefMutable(srcMi->memberDef());
4102 MemberDefMutable *dmdm = toMemberDefMutable(dstMi->memberDef());
4103 if (smdm && dmdm)
4104 {
4106 dmdm->setCategory(category);
4107 dmdm->setCategoryRelation(smdm);
4108 smdm->setCategoryRelation(dmdm);
4109 }
4110 }
4111 }
4112 else // new method name
4113 {
4114 AUTO_TRACE_ADD("New member {}",srcMni->memberName());
4115 // create a deep copy of the list
4116 MemberNameInfo *newMni = dstMnd.add(srcMni->memberName());
4117
4118 // copy the member(s) from the category to this class
4119 for (auto &mi : *srcMni)
4120 {
4121 //printf("Adding '%s'\n",qPrint(mi->memberDef->name()));
4122 Protection prot = mi->prot();
4123 //if (makePrivate) prot = Private;
4124 auto newMd = mi->memberDef()->deepCopy();
4125 if (newMd)
4126 {
4127 auto mmd = toMemberDefMutable(newMd.get());
4128 AUTO_TRACE_ADD("Copying member {}",mmd->name());
4129 if (mmd)
4130 {
4131 mmd->moveTo(this);
4132 }
4133
4134 auto newMi=std::make_unique<MemberInfo>(newMd.get(),prot,mi->virt(),mi->inherited(),mi->virtualBaseClass());
4135 newMi->setScopePath(mi->scopePath());
4136 newMi->setAmbigClass(mi->ambigClass());
4137 newMi->setAmbiguityResolutionScope(mi->ambiguityResolutionScope());
4138 newMni->push_back(std::move(newMi));
4139
4140 // also add the newly created member to the global members list
4141
4142 QCString name = newMd->name();
4144
4145 if (mmd)
4146 {
4147 mmd->setCategory(category);
4148 mmd->setCategoryRelation(mi->memberDef());
4149 }
4150 auto miMmd = toMemberDefMutable(mi->memberDef());
4151 if (miMmd) miMmd->setCategoryRelation(newMd.get());
4152
4153 if (mmd && (makePrivate || isExtension))
4154 {
4155 mmd->makeImplementationDetail();
4156 }
4157 internalInsertMember(newMd.get(),prot,FALSE);
4158 mn->push_back(std::move(newMd));
4159 }
4160 }
4161 }
4162 }
4163 }
4164}
4165
4166//----------------------------------------------------------------------------
4167
4169 Protection prot)
4170{
4171 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
4172 bool umlLook = Config_getBool(UML_LOOK);
4173 if (prot==Protection::Private && !extractPrivate) return;
4174 //printf("%s::addUsedClass(%s,%s)\n",qPrint(name()),qPrint(cd->name()),accessName);
4175
4176 auto it = std::find_if(m_usesImplClassList.begin(),
4177 m_usesImplClassList.end(),
4178 [&cd](const auto &ucd) { return ucd.classDef==cd; });
4179 if (it==m_usesImplClassList.end())
4180 {
4181 m_usesImplClassList.emplace_back(cd);
4182 //printf("Adding used class %s to class %s via accessor %s\n",
4183 // qPrint(cd->name()),qPrint(name()),accessName);
4184 it = m_usesImplClassList.end()-1;
4185 }
4186 QCString acc = accessName;
4187 if (umlLook)
4188 {
4189 switch(prot)
4190 {
4191 case Protection::Public: acc.prepend("+"); break;
4192 case Protection::Private: acc.prepend("-"); break;
4193 case Protection::Protected: acc.prepend("#"); break;
4194 case Protection::Package: acc.prepend("~"); break;
4195 }
4196 }
4197 (*it).addAccessor(acc);
4198}
4199
4201 Protection prot)
4202{
4203 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
4204 bool umlLook = Config_getBool(UML_LOOK);
4205 if (prot==Protection::Private && !extractPrivate) return;
4206 //printf("%s::addUsedByClass(%s,%s)\n",qPrint(name()),qPrint(cd->name()),accessName);
4207 //
4208 auto it = std::find_if(m_usedByImplClassList.begin(),
4210 [&cd](const auto &ucd) { return ucd.classDef==cd; });
4211 if (it==m_usedByImplClassList.end())
4212 {
4213 m_usedByImplClassList.emplace_back(cd);
4214 //printf("Adding used by class %s to class %s\n",
4215 // qPrint(cd->name()),qPrint(name()));
4216 it = m_usedByImplClassList.end()-1;
4217 }
4218 QCString acc = accessName;
4219 if (umlLook)
4220 {
4221 switch(prot)
4222 {
4223 case Protection::Public: acc.prepend("+"); break;
4224 case Protection::Private: acc.prepend("-"); break;
4225 case Protection::Protected: acc.prepend("#"); break;
4226 case Protection::Package: acc.prepend("~"); break;
4227 }
4228 }
4229 (*it).addAccessor(acc);
4230}
4231
4232
4237
4239{
4240 bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
4241 bool inlineSimpleClasses = Config_getBool(INLINE_SIMPLE_STRUCTS);
4243 {
4244 Definition *scope=nullptr;
4245 if (inlineGroupedClasses && !partOfGroups().empty())
4246 {
4247 // point to the group that embeds this class
4248 return partOfGroups().front()->getOutputFileBase();
4249 }
4250 else if (inlineSimpleClasses && m_isSimple && !partOfGroups().empty())
4251 {
4252 // point to simple struct inside a group
4253 return partOfGroups().front()->getOutputFileBase();
4254 }
4255 else if (inlineSimpleClasses && m_isSimple && (scope=getOuterScope()))
4256 {
4257 if (scope==Doxygen::globalScope && getFileDef() && getFileDef()->isLinkableInProject()) // simple struct embedded in file
4258 {
4259 return getFileDef()->getOutputFileBase();
4260 }
4261 else if (scope->isLinkableInProject()) // simple struct embedded in other container (namespace/group/class)
4262 {
4263 return getOuterScope()->getOutputFileBase();
4264 }
4265 }
4266 }
4267 AUTO_TRACE("name='{}' m_templateMaster={} m_implicitTemplateInstance={}",name(),(void*)m_templateMaster,m_implicitTemplateInstance);
4269 {
4270 // point to the template of which this class is an instance
4271 return m_templateMaster->getOutputFileBase();
4272 }
4273 return m_fileName;
4274}
4275
4280
4282{
4284 {
4285 return m_templateMaster->getSourceFileBase();
4286 }
4287 else
4288 {
4290 }
4291}
4292
4293void ClassDefImpl::setGroupDefForAllMembers(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs)
4294{
4295 gd->addClass(this);
4296 //printf("ClassDefImpl::setGroupDefForAllMembers(%s)\n",qPrint(gd->name()));
4297 for (auto &mni : m_allMemberNameInfoLinkedMap)
4298 {
4299 for (auto &mi : *mni)
4300 {
4301 MemberDefMutable *md = toMemberDefMutable(mi->memberDef());
4302 if (md)
4303 {
4304 md->setGroupDef(gd,pri,fileName,startLine,hasDocs);
4305 gd->insertMember(md,TRUE);
4306 ClassDefMutable *innerClass = toClassDefMutable(const_cast<ClassDef*>(md->getClassDefOfAnonymousType()));
4307 if (innerClass) innerClass->setGroupDefForAllMembers(gd,pri,fileName,startLine,hasDocs);
4308 }
4309 }
4310 }
4311}
4312
4314{
4315 //printf("**** %s::addInnerCompound(%s)\n",qPrint(name()),qPrint(d->name()));
4316 if (d->definitionType()==Definition::TypeClass) // only classes can be
4317 // nested in classes.
4318 {
4319 m_innerClasses.add(d->localName(),toClassDef(d));
4320 }
4321}
4322
4324{
4325 return m_innerClasses.find(name);
4326}
4327
4329 int startLine, int startColumn, const QCString &templSpec,bool &freshInstance)
4330{
4331 freshInstance = FALSE;
4332 auto it = std::find_if(m_templateInstances.begin(),
4333 m_templateInstances.end(),
4334 [&templSpec](const auto &ti) { return templSpec==ti.templSpec; });
4335 ClassDefMutable *templateClass=nullptr;
4336 if (it!=m_templateInstances.end())
4337 {
4338 templateClass = toClassDefMutable((*it).classDef);
4339 }
4340 if (templateClass==nullptr)
4341 {
4342 QCString tcname = removeRedundantWhiteSpace(name()+templSpec);
4343 AUTO_TRACE("New template instance class name='{}' templSpec='{}' inside '{}' hidden={}",
4344 name(),templSpec,name(),isHidden());
4345
4346 ClassDef *foundCd = Doxygen::classLinkedMap->find(tcname);
4347 if (foundCd)
4348 {
4349 return foundCd;
4350 }
4351 templateClass =
4353 Doxygen::classLinkedMap->add(tcname,
4354 std::unique_ptr<ClassDef>(
4355 new ClassDefImpl(fileName,startLine,startColumn,tcname,ClassDef::Class))));
4356 if (templateClass)
4357 {
4358 templateClass->setTemplateMaster(this);
4359 ArgumentList tal = *stringToArgumentList(getLanguage(),templSpec);
4360 templateClass->setTemplateArguments(tal);
4361 templateClass->setOuterScope(getOuterScope());
4362 templateClass->setHidden(isHidden());
4363 templateClass->setArtificial(isArtificial());
4364 templateClass->setImplicitTemplateInstance(true);
4365 m_templateInstances.emplace_back(templSpec,templateClass);
4366
4367 // also add nested classes
4368 for (const auto &innerCd : m_innerClasses)
4369 {
4370 QCString innerName = tcname+"::"+innerCd->localName();
4371 ClassDefMutable *innerClass =
4373 Doxygen::classLinkedMap->add(innerName,
4374 std::unique_ptr<ClassDef>(
4375 new ClassDefImpl(fileName,startLine,startColumn,innerName,ClassDef::Class))));
4376 if (innerClass)
4377 {
4378 templateClass->addInnerCompound(innerClass);
4379 innerClass->setOuterScope(templateClass);
4380 innerClass->setHidden(isHidden());
4381 innerClass->setArtificial(TRUE);
4382 innerClass->setImplicitTemplateInstance(true);
4383 }
4384 }
4385 freshInstance=TRUE;
4386 }
4387 }
4388 return templateClass;
4389}
4390
4392{
4393 AUTO_TRACE("this={} cd={} templSpec={}",name(),templateClass->name(),templSpec);
4394 m_templateInstances.emplace_back(templSpec,templateClass);
4395}
4396
4398{
4399 m_templBaseClassNames = templateNames;
4400}
4401
4406
4409 const QCString &templSpec)
4410{
4411 AUTO_TRACE("this={} md={}",name(),md->name());
4412 auto actualArguments_p = stringToArgumentList(getLanguage(),templSpec);
4413 auto imd = md->createTemplateInstanceMember(templateArguments,actualArguments_p);
4414 auto mmd = toMemberDefMutable(imd.get());
4415 mmd->setMemberClass(this);
4416 mmd->setTemplateMaster(md);
4417 mmd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
4418 mmd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
4419 mmd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
4420 mmd->setMemberSpecifiers(md->getMemberSpecifiers());
4421 mmd->setMemberGroupId(md->getMemberGroupId());
4422 mmd->setArtificial(true);
4423 insertMember(imd.get());
4424 //printf("Adding member=%s %s%s to class %s templSpec %s\n",
4425 // imd->typeString(),qPrint(imd->name()),imd->argsString(),
4426 // qPrint(imd->getClassDef()->name()),templSpec);
4427 // insert imd in the list of all members
4428 //printf("Adding member=%s class=%s\n",qPrint(imd->name()),qPrint(name()));
4429 MemberName *mn = Doxygen::memberNameLinkedMap->add(imd->name());
4430 mn->push_back(std::move(imd));
4431}
4432
4434{
4435 AUTO_TRACE("this={} cd={} templSpec={}",name(),cd->name(),templSpec);
4436 //printf("%s::addMembersToTemplateInstance(%s,%s)\n",qPrint(name()),qPrint(cd->name()),templSpec);
4437 for (const auto &mni : cd->memberNameInfoLinkedMap())
4438 {
4439 for (const auto &mi : *mni)
4440 {
4441 const MemberDef *md = mi->memberDef();
4442 if (m_allMemberNameInfoLinkedMap.find(md->name())==nullptr) // only insert the member if not hidden by one with the same name (#11541)
4443 {
4445 }
4446 }
4447 }
4448 // also instantatie members for nested classes
4449 for (const auto &innerCd : cd->getClasses())
4450 {
4451 ClassDefMutable *ncd = toClassDefMutable(m_innerClasses.find(innerCd->localName()));
4452 if (ncd)
4453 {
4454 ncd->addMembersToTemplateInstance(innerCd,cd->templateArguments(),templSpec);
4455 }
4456 }
4457}
4458
4460{
4462 {
4463 return m_templateMaster->getReference();
4464 }
4465 else
4466 {
4468 }
4469}
4470
4472{
4474 {
4475 return m_templateMaster->isReference();
4476 }
4477 else
4478 {
4480 }
4481}
4482
4484{
4485 ArgumentLists result;
4487 while (d && d->definitionType()==Definition::TypeClass)
4488 {
4489 result.insert(result.begin(),toClassDef(d)->templateArguments());
4490 d = d->getOuterScope();
4491 }
4492 if (!templateArguments().empty())
4493 {
4494 result.push_back(templateArguments());
4495 }
4496 return result;
4497}
4498
4500 const ArgumentLists *actualParams,uint32_t *actualParamIndex) const
4501{
4502 return makeQualifiedNameWithTemplateParameters(this,actualParams,actualParamIndex);
4503}
4504
4506{
4507 QCString name = m_className.isEmpty() ? localName() : m_className;
4508 auto lang = getLanguage();
4509 if (lang==SrcLangExt::CSharp)
4510 {
4512 }
4513 return name;
4514}
4515
4520
4522{
4523 if (!isLinkableInProject()) return;
4524 SrcLangExt lang = getLanguage();
4526 qualifiedName(),
4527 theTranslator->trCompoundType(compoundType(), lang),
4529 displayName(),
4530 QCString(),
4531 this
4532 );
4533 for (const auto &mg : m_memberGroups)
4534 {
4535 mg->addListReferences(this);
4536 }
4537 for (auto &ml : m_memberLists)
4538 {
4539 if (ml->listType().isDetailed())
4540 {
4541 ml->addListReferences(this);
4542 }
4543 }
4544}
4545
4547{
4548 if (!isLinkableInProject()) return;
4550 for (const auto &mg : m_memberGroups)
4551 {
4552 mg->addRequirementReferences(this);
4553 }
4554 for (auto &ml : m_memberLists)
4555 {
4556 if (ml->listType().isDetailed())
4557 {
4558 ml->addRequirementReferences(this);
4559 }
4560 }
4561}
4562
4564{
4565 const MemberDef *xmd = nullptr;
4567 if (mni)
4568 {
4569 const int maxInheritanceDepth = 100000;
4570 int mdist=maxInheritanceDepth;
4571 for (auto &mi : *mni)
4572 {
4573 const ClassDef *mcd=mi->memberDef()->getClassDef();
4574 int m=minClassDistance(this,mcd);
4575 //printf("found member in %s linkable=%d m=%d\n",
4576 // qPrint(mcd->name()),mcd->isLinkable(),m);
4577 if (m<mdist)
4578 {
4579 mdist=m;
4580 xmd=mi->memberDef();
4581 }
4582 }
4583 }
4584 //printf("getMemberByName(%s)=%p\n",qPrint(name),xmd);
4585 return xmd;
4586}
4587
4589{
4590 return md->getClassDef() && isBaseClass(md->getClassDef(),TRUE,QCString());
4591}
4592
4594{
4595 for (auto &ml : m_memberLists)
4596 {
4597 if (ml->listType()==lt)
4598 {
4599 return ml.get();
4600 }
4601 }
4602 return nullptr;
4603}
4604
4606{
4607 AUTO_TRACE("{} md={} lt={} isBrief={}",name(),md->name(),lt,isBrief);
4608 bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
4609 bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
4610 const auto &ml = m_memberLists.get(lt,MemberListContainer::Class);
4611 ml->setNeedsSorting((isBrief && sortBriefDocs) || (!isBrief && sortMemberDocs));
4612 ml->push_back(md);
4613
4614 // for members in the declaration lists we set the section, needed for member grouping
4615 if (!ml->listType().isDetailed())
4616 {
4618 if (mdm)
4619 {
4620 mdm->setSectionList(this,ml.get());
4621 }
4622 }
4623}
4624
4626{
4627 for (auto &ml : m_memberLists)
4628 {
4629 if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
4630 }
4631 if (Config_getBool(SORT_BRIEF_DOCS))
4632 {
4633 std::stable_sort(m_innerClasses.begin(),
4634 m_innerClasses.end(),
4635 [](const auto &c1,const auto &c2)
4636 {
4637 return Config_getBool(SORT_BY_SCOPE_NAME) ?
4638 qstricmp_sort(c1->name(), c2->name() )<0 :
4639 qstricmp_sort(c1->className(), c2->className())<0 ;
4640 });
4641 }
4642}
4643
4645 MemberListType lt2,bool invert,bool showAlways,ClassDefSet &visitedClasses) const
4646{
4647 //printf("%s: countMemberDeclarations for %s and %s\n",qPrint(name()),lt.to_string(),lt2.to_string());
4648 int count=0;
4649 MemberList * ml = getMemberList(lt);
4650 MemberList * ml2 = getMemberList(lt2);
4651 if (getLanguage()!=SrcLangExt::VHDL) // use specific declarations function
4652 {
4653 if (ml)
4654 {
4655 count+=ml->numDecMembers(inheritedFrom);
4656 //printf("-> ml=%d\n",ml->numDecMembers());
4657 }
4658 if (ml2)
4659 {
4660 count+=ml2->numDecMembers(inheritedFrom);
4661 //printf("-> ml2=%d\n",ml2->numDecMembers());
4662 }
4663 // also include grouped members that have their own section in the class (see bug 722759)
4664 if (inheritedFrom)
4665 {
4666 for (const auto &mg : m_memberGroups)
4667 {
4668 count+=mg->countGroupedInheritedMembers(lt);
4669 if (!lt2.isInvalid()) count+=mg->countGroupedInheritedMembers(lt2);
4670 }
4671 }
4672 bool inlineInheritedMembers = Config_getBool(INLINE_INHERITED_MEMB);
4673 if (!inlineInheritedMembers) // show inherited members as separate lists
4674 {
4675 count+=countInheritedDecMembers(lt,inheritedFrom,invert,showAlways,visitedClasses);
4676 }
4677 }
4678 //printf("-> %d\n",count);
4679 return count;
4680}
4681
4683{
4684 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
4685 {
4686 if (lde->kind()==LayoutDocEntry::MemberDecl)
4687 {
4688 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
4689 if (lmd)
4690 {
4691 MemberList * ml = getMemberList(lmd->type);
4692 if (ml)
4693 {
4695 }
4696 }
4697 }
4698 else if (lde->kind()==LayoutDocEntry::MemberGroups)
4699 {
4700 for (const auto &mg : m_memberGroups)
4701 {
4702 mg->setAnonymousEnumType();
4703 }
4704 }
4705 }
4706}
4707
4709{
4710 for (auto &ml : m_memberLists)
4711 {
4712 ml->countDecMembers();
4713 ml->countDocMembers();
4714 }
4715 for (const auto &mg : m_memberGroups)
4716 {
4717 mg->countDecMembers();
4718 mg->countDocMembers();
4719 }
4720}
4721
4723 const ClassDef *inheritedFrom,bool invert,bool showAlways,
4724 ClassDefSet &visitedClasses) const
4725{
4726 int inhCount = 0;
4727 int count = countMembersIncludingGrouped(lt,inheritedFrom,FALSE);
4728 bool process = count>0;
4729 //printf("%s: countInheritedDecMembers: lt=%s process=%d count=%d invert=%d\n",
4730 // qPrint(name()),lt.to_string(),process,count,invert);
4731 if ((process^invert) || showAlways)
4732 {
4733 for (const auto &ibcd : m_inherits)
4734 {
4735 ClassDefMutable *icd = toClassDefMutable(ibcd.classDef);
4738 if (icd && icd->isLinkable())
4739 {
4740 convertProtectionLevel(lt,ibcd.prot,&lt1,&lt2);
4741 //printf("%s: convert %s->(%s,%s) prot=%d\n",
4742 // qPrint(icd->name()),lt.to_string(),lt1.to_string(),lt2.to_string(),ibcd.prot);
4743 if (visitedClasses.find(icd)==visitedClasses.end())
4744 {
4745 visitedClasses.insert(icd); // guard for multiple virtual inheritance
4746 if (!lt1.isInvalid())
4747 {
4748 inhCount+=icd->countMemberDeclarations(lt1,inheritedFrom,lt2,FALSE,TRUE,visitedClasses);
4749 }
4750 }
4751 }
4752 }
4753 }
4754 //printf("%s: count=%d\n",qPrint(name()),inhCount);
4755 return inhCount;
4756}
4757
4759 QCString &title,QCString &subtitle) const
4760{
4761 SrcLangExt lang = getLanguage();
4762 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
4763 {
4764 if (lde->kind()==LayoutDocEntry::MemberDecl)
4765 {
4766 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
4767 if (lmd && lmd->type==type)
4768 {
4769 title = lmd->title(lang);
4770 subtitle = lmd->subtitle(lang);
4771 return;
4772 }
4773 }
4774 }
4775 title="";
4776 subtitle="";
4777}
4778
4780{
4781 int totalCount=0;
4782 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
4783 {
4784 if (lde->kind()==LayoutDocEntry::MemberDecl)
4785 {
4786 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
4787 if (lmd && lmd->type!=MemberListType::Friends()) // friendship is not inherited
4788 {
4789 ClassDefSet visited;
4790 totalCount+=countInheritedDecMembers(lmd->type,this,TRUE,FALSE,visited);
4791 }
4792 }
4793 }
4794 //printf("countAdditionalInheritedMembers()=%d\n",totalCount);
4795 return totalCount;
4796}
4797
4799{
4800 //printf("**** writeAdditionalInheritedMembers()\n");
4801 for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class))
4802 {
4803 if (lde->kind()==LayoutDocEntry::MemberDecl)
4804 {
4805 const LayoutDocEntryMemberDecl *lmd = dynamic_cast<const LayoutDocEntryMemberDecl*>(lde.get());
4806 if (lmd && lmd->type!=MemberListType::Friends())
4807 {
4808 ClassDefSet visited;
4810 }
4811 }
4812 }
4813}
4814
4816 const ClassDef *inheritedFrom,bool additional) const
4817{
4818 int count=0;
4819 MemberList *ml = getMemberList(lt);
4820 if (ml)
4821 {
4822 count=ml->countInheritableMembers(inheritedFrom);
4823 }
4824 //printf("%s:countMembersIncludingGrouped: count=%d\n",qPrint(name()),count);
4825 for (const auto &mg : m_memberGroups)
4826 {
4827 bool hasOwnSection = !mg->allMembersInSameSection() ||
4828 !m_subGrouping; // group is in its own section
4829 if ((additional && hasOwnSection) || (!additional && !hasOwnSection))
4830 {
4831 count+=mg->countGroupedInheritedMembers(lt);
4832 }
4833 }
4834 //printf("%s:countMembersIncludingGrouped(lt=%s,%s)=%d\n",
4835 // qPrint(name()),qPrint(lt.to_string()),ml?qPrint(ml->listType().to_string()):"<none>",count);
4836 return count;
4837}
4838
4839
4842 const ClassDef *inheritedFrom,bool invert,bool showAlways) const
4843{
4844 int count = countMembersIncludingGrouped(lt,inheritedFrom,FALSE);
4845 bool process = count>0;
4846 //printf("%s: writeInheritedMemberDec: lt=%s process=%d invert=%d always=%d\n",
4847 // qPrint(name()),qPrint(lt.to_string()),process,invert,showAlways);
4848 if ((process^invert) || showAlways)
4849 {
4850 for (const auto &ibcd : m_inherits)
4851 {
4852 ClassDefMutable *icd=toClassDefMutable(ibcd.classDef);
4853 if (icd && icd->isLinkable())
4854 {
4857 convertProtectionLevel(lt,ibcd.prot,&lt1,&lt3);
4858 if (lt2.isInvalid() && !lt3.isInvalid())
4859 {
4860 lt2=lt3;
4861 }
4862 //printf("%s:convert %s->(%s,%s) prot=%d\n",qPrint(icd->name()),qPrint(lt.to_string()),
4863 // qPrint(lt1.to_string()),qPrint(lt2.to_string()),ibcd.prot);
4864 if (visitedClasses.find(icd)==visitedClasses.end())
4865 {
4866 visitedClasses.insert(icd); // guard for multiple virtual inheritance
4867 if (!lt1.isInvalid())
4868 {
4869 //printf("--> writeMemberDeclarations for type %s\n",qPrint(lt1.to_string()));
4870 icd->writeMemberDeclarations(ol,visitedClasses,lt1,
4871 title,QCString(),FALSE,inheritedFrom,lt2,FALSE,TRUE);
4872 }
4873 }
4874 else
4875 {
4876 //printf("%s: class already visited!\n",qPrint(icd->name()));
4877 }
4878 }
4879 }
4880 }
4881}
4882
4884 MemberListType lt,const QCString &title,
4885 const QCString &subTitle,bool showInline,const ClassDef *inheritedFrom,MemberListType lt2,
4886 bool invert,bool showAlways) const
4887{
4888 //printf("%s: ClassDefImpl::writeMemberDeclarations lt=%s lt2=%s\n",qPrint(name()),qPrint(lt.to_string()),qPrint(lt2.to_string()));
4889 MemberList * ml = getMemberList(lt);
4890 MemberList * ml2 = getMemberList(lt2);
4891 if (getLanguage()==SrcLangExt::VHDL) // use specific declarations function
4892 {
4893 static const ClassDef *cdef;
4894 if (cdef!=this)
4895 { // only one inline link
4897 cdef=this;
4898 }
4899 if (ml)
4900 {
4901 VhdlDocGen::writeVhdlDeclarations(ml,ol,nullptr,this,nullptr,nullptr,nullptr);
4902 }
4903 }
4904 else
4905 {
4906 //printf("%s::writeMemberDeclarations(%s) ml=%p ml2=%p\n",qPrint(name()),qPrint(title),(void*)ml,(void*)ml2);
4907 QCString tt = title, st = subTitle;
4908 if (ml)
4909 {
4910 //printf(" writeDeclarations ml type=%s count=%d\n",qPrint(lt.to_string()),ml->numDecMembers(inheritedFrom));
4911 ml->writeDeclarations(ol,this,nullptr,nullptr,nullptr,nullptr,tt,st,FALSE,showInline,inheritedFrom,lt,true);
4912 tt.clear();
4913 st.clear();
4914 }
4915 if (ml2)
4916 {
4917 //printf(" writeDeclarations ml2 type=%s count=%d\n",qPrint(lt2.to_string()),ml2->numDecMembers(inheritedFrom));
4918 ml2->writeDeclarations(ol,this,nullptr,nullptr,nullptr,nullptr,tt,st,FALSE,showInline,inheritedFrom,lt,ml==nullptr);
4919 }
4920 bool inlineInheritedMembers = Config_getBool(INLINE_INHERITED_MEMB);
4921 if (!inlineInheritedMembers) // show inherited members as separate lists
4922 {
4923 writeInheritedMemberDeclarations(ol,visitedClasses,lt,lt2,title,
4924 inheritedFrom ? inheritedFrom : this,
4925 invert,showAlways);
4926 }
4927 }
4928}
4929
4931 const ClassDef *inheritedFrom,const QCString &inheritId) const
4932{
4933 //printf("** %s::addGroupedInheritedMembers() inheritId=%s\n",qPrint(name()),qPrint(inheritId));
4934 for (const auto &mg : m_memberGroups)
4935 {
4936 if (!mg->allMembersInSameSection() || !m_subGrouping) // group is in its own section
4937 {
4938 mg->addGroupedInheritedMembers(ol,this,lt,inheritedFrom,inheritId);
4939 }
4940 }
4941}
4942
4944{
4945 //printf("%s: ClassDefImpl::writeMemberDocumentation()\n",qPrint(name()));
4946 MemberList * ml = getMemberList(lt);
4947 if (ml) ml->writeDocumentation(ol,displayName(),this,title,ml->listType().toLabel(),FALSE,showInline);
4948}
4949
4951{
4952 //printf("%s: ClassDefImpl::writeSimpleMemberDocumentation()\n",qPrint(name()));
4953 MemberList * ml = getMemberList(lt);
4954 if (ml) ml->writeSimpleDocumentation(ol,this);
4955}
4956
4958 MemberListType lt,bool inGroup,
4959 int indentLevel,const ClassDef *inheritedFrom,const QCString &inheritId) const
4960{
4961 //printf("%s: ClassDefImpl::writePlainMemberDeclaration()\n",qPrint(name()));
4962 MemberList * ml = getMemberList(lt);
4963 if (ml)
4964 {
4965 ml->writePlainDeclarations(ol,inGroup,this,nullptr,nullptr,nullptr,nullptr,indentLevel,inheritedFrom,inheritId);
4966 }
4967}
4968
4970{
4971 return m_isLocal;
4972}
4973
4978
4983
4985{
4986 return m_inherits;
4987}
4988
4990{
4991 m_inherits = bcd;
4992}
4993
4995{
4996 return m_inheritedBy;
4997}
4998
5000{
5001 m_inheritedBy = bcd;
5002}
5003
5008
5010{
5011 std::stable_sort(m_allMemberNameInfoLinkedMap.begin(),
5013 [](const auto &m1,const auto &m2)
5014 {
5015 return qstricmp_sort(m1->memberName(),m2->memberName())<0;
5016 });
5017}
5018
5020{
5021 return m_prot;
5022}
5023
5025{
5026 return m_tempArgs;
5027}
5028
5030{
5031 return m_fileDef;
5032}
5033
5035{
5036 return m_moduleDef;
5037}
5038
5043
5045{
5046 return m_templateMaster;
5047}
5048
5053
5058
5060{
5061 return !m_tempArgs.empty();
5062}
5063
5065{
5066 return m_incInfo.get();
5067}
5068
5073
5078
5083
5085{
5086 return m_isTemplArg;
5087}
5088
5090{
5091 return m_isAbstract || m_spec.isAbstract();
5092}
5093
5095{
5096 return m_spec.isFinal();
5097}
5098
5100{
5101 return m_spec.isSealed();
5102}
5103
5105{
5106 return m_spec.isPublished();
5107}
5108
5110{
5111 return m_spec.isForwardDecl();
5112}
5113
5115{
5116 return m_spec.isInterface();
5117}
5118
5120{
5121 return getLanguage()==SrcLangExt::ObjC;
5122}
5123
5125{
5126 return getLanguage()==SrcLangExt::Fortran;
5127}
5128
5130{
5131 return getLanguage()==SrcLangExt::CSharp;
5132}
5133
5135{
5136 return m_categoryOf;
5137}
5138
5140{
5141 return m_memberLists;
5142}
5143
5145{
5146 return m_memberGroups;
5147}
5148
5150{
5151 m_fileDef = fd;
5152}
5153
5155{
5156 m_moduleDef = mod;
5157}
5158
5160{
5161 m_subGrouping = enabled;
5162}
5163
5165{
5166 m_prot=p;
5167 if (getLanguage()==SrcLangExt::VHDL && VhdlDocGen::convert(p)==VhdlDocGen::ARCHITECTURECLASS)
5168 {
5169 m_className = name();
5170 }
5171}
5172
5174{
5175 m_isStatic=b;
5176}
5177
5182
5184{
5185 assert(tm!=this);
5187}
5188
5190{
5191 m_isTemplArg = b;
5192}
5193
5195{
5196 m_categoryOf = cd;
5197}
5198
5200{
5201 m_usedOnly = b;
5202}
5203
5205{
5206 return m_usedOnly;
5207}
5208
5210{
5211 return m_isSimple;
5212}
5213
5215{
5216 return m_arrowOperator;
5217}
5218
5220{
5221 md->setMemberType(t);
5222 for (auto &ml : m_memberLists)
5223 {
5224 ml->remove(md);
5225 }
5226 insertMember(md);
5227}
5228
5230{
5231 QCString anc;
5233 {
5235 {
5236 // point to the template of which this class is an instance
5237 anc = m_templateMaster->getOutputFileBase();
5238 }
5239 else
5240 {
5241 anc = m_fileName;
5242 }
5243 }
5244 return anc;
5245}
5246
5248{
5249 bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
5250 bool inlineSimpleClasses = Config_getBool(INLINE_SIMPLE_STRUCTS);
5251
5252 Definition *container = getOuterScope();
5253
5254 bool containerLinkable =
5255 container &&
5256 (
5257 (container==Doxygen::globalScope && getFileDef() && getFileDef()->isLinkableInProject()) || // global class in documented file
5258 container->isLinkableInProject() // class in documented scope
5259 );
5260
5261 if (isAnonymous())
5262 {
5263 return false; // don't inline an anonymous class
5264 }
5265
5266 // inline because of INLINE_GROUPED_CLASSES=YES ?
5267 bool b1 = (inlineGroupedClasses && !partOfGroups().empty()); // a grouped class
5268 // inline because of INLINE_SIMPLE_STRUCTS=YES ?
5269 bool b2 = (inlineSimpleClasses && m_isSimple && // a simple class
5270 (containerLinkable || // in a documented container
5271 !partOfGroups().empty() // or part of a group
5272 )
5273 );
5274 //printf("%s::isEmbeddedInOuterScope(): inlineGroupedClasses=%d "
5275 // "inlineSimpleClasses=%d partOfGroups()=%p m_isSimple=%d "
5276 // "getOuterScope()=%s b1=%d b2=%d\n",
5277 // qPrint(name()),inlineGroupedClasses,inlineSimpleClasses,
5278 // partOfGroups().pointer(),m_isSimple,getOuterScope()?qPrint(getOuterScope()->name()):"<none>",b1,b2);
5279 return b1 || b2; // either reason will do
5280}
5281
5283{
5284 return m_tagLessRef;
5285}
5286
5288{
5289 m_tagLessRef = cd;
5290}
5291
5293{
5294 for (auto &ml : m_memberLists)
5295 {
5296 ml->remove(md);
5297 }
5298}
5299
5301{
5302 return m_isJavaEnum;
5303}
5304
5306{
5307 m_spec = spec;
5308}
5309
5311{
5312 for (const auto &sx : qualifiers)
5313 {
5314 bool alreadyAdded = std::find(m_qualifiers.begin(), m_qualifiers.end(), sx) != m_qualifiers.end();
5315 if (!alreadyAdded)
5316 {
5317 m_qualifiers.push_back(sx);
5318 }
5319 }
5320}
5321
5326
5328{
5329 AUTO_TRACE("name={}",md->name());
5330 const auto &mni = m_allMemberNameInfoLinkedMap.find(md->name());
5331 if (mni)
5332 {
5333 for (const auto &mi : *mni)
5334 {
5335 const MemberDef *classMd = mi->memberDef();
5336 const ArgumentList &classAl = classMd->argumentList();
5337 const ArgumentList &al = md->argumentList();
5338 bool found = matchArguments2(
5339 classMd->getOuterScope(),classMd->getFileDef(),classMd->typeString(),&classAl,
5340 md->getOuterScope(),md->getFileDef(),md->typeString(),&al,
5341 true,getLanguage()
5342 );
5343 if (found)
5344 {
5345 AUTO_TRACE_EXIT("true");
5346 return true;
5347 }
5348 }
5349 }
5350 AUTO_TRACE_EXIT("false");
5351 return false;
5352}
5353
5355{
5356 QCString n = name();
5357 int si = n.find('(');
5358 int ei = n.find(')');
5359 bool b = ei>si && n.mid(si+1,ei-si-1).stripWhiteSpace().isEmpty();
5360 return b;
5361}
5362
5364{
5365 return m_files;
5366}
5367
5369{
5370 return m_typeConstraints;
5371}
5372
5374{
5375 return m_examples;
5376}
5377
5379{
5380 return m_subGrouping;
5381}
5382
5384{
5385 return m_spec.isLocal();
5386}
5387
5389{
5390 m_metaData = md;
5391}
5392
5397
5402
5404{
5406}
5407
5409{
5411}
5412
5414{
5415 switch (compoundType())
5416 {
5417 case Class: return CodeSymbolType::Class; break;
5418 case Struct: return CodeSymbolType::Struct; break;
5419 case Union: return CodeSymbolType::Union; break;
5420 case Interface: return CodeSymbolType::Interface; break;
5421 case Protocol: return CodeSymbolType::Protocol; break;
5422 case Category: return CodeSymbolType::Category; break;
5423 case Exception: return CodeSymbolType::Exception; break;
5424 case Service: return CodeSymbolType::Service; break;
5425 case Singleton: return CodeSymbolType::Singleton; break;
5426 }
5427 return CodeSymbolType::Class;
5428}
5429
5434
5439
5440
5441// --- Cast functions
5442//
5444{
5445 if (d && (typeid(*d)==typeid(ClassDefImpl) || typeid(*d)==typeid(ClassDefAliasImpl)))
5446 {
5447 return static_cast<ClassDef*>(d);
5448 }
5449 else
5450 {
5451 return nullptr;
5452 }
5453}
5454
5456{
5457 Definition *d = toDefinition(md);
5458 if (d && typeid(*d)==typeid(ClassDefImpl))
5459 {
5460 return static_cast<ClassDef*>(d);
5461 }
5462 else
5463 {
5464 return nullptr;
5465 }
5466}
5467
5469{
5470 if (d && (typeid(*d)==typeid(ClassDefImpl) || typeid(*d)==typeid(ClassDefAliasImpl)))
5471 {
5472 return static_cast<const ClassDef*>(d);
5473 }
5474 else
5475 {
5476 return nullptr;
5477 }
5478}
5479
5481{
5482 if (d && typeid(*d)==typeid(ClassDefImpl))
5483 {
5484 return static_cast<ClassDefMutable*>(d);
5485 }
5486 else
5487 {
5488 return nullptr;
5489 }
5490}
5491
5492// --- Helpers
5493
5494/*! Get a class definition given its name.
5495 * Returns nullptr if the class is not found.
5496 */
5498{
5499 if (n.isEmpty()) return nullptr;
5500 return Doxygen::classLinkedMap->find(n);
5501}
5502
5504{
5505 for (const auto &bcd : bcl)
5506 {
5507 const ClassDef *cd=bcd.classDef;
5508 if (cd->isVisibleInHierarchy()) return true;
5509 if (classHasVisibleRoot(cd->baseClasses())) return true;
5510 }
5511 return false;
5512}
5513
5515{
5516 BaseClassList bcl;
5517
5518 if (cd->getLanguage()==SrcLangExt::VHDL) // reverse baseClass/subClass relation
5519 {
5520 if (cd->baseClasses().empty()) return FALSE;
5521 bcl=cd->baseClasses();
5522 }
5523 else
5524 {
5525 if (cd->subClasses().empty()) return FALSE;
5526 bcl=cd->subClasses();
5527 }
5528
5529 for (const auto &bcd : bcl)
5530 {
5531 if (bcd.classDef->isVisibleInHierarchy())
5532 {
5533 return TRUE;
5534 }
5535 }
5536 return FALSE;
5537}
5538
5540{
5541 bool allExternals = Config_getBool(ALLEXTERNALS);
5542 return (allExternals && cd->isLinkable()) || cd->isLinkableInProject();
5543}
5544
5545//----------------------------------------------------------------------
5546// recursive function that returns the number of branches in the
5547// inheritance tree that the base class 'bcd' is below the class 'cd'
5548
5549int minClassDistance(const ClassDef *cd,const ClassDef *bcd,int level)
5550{
5551 const int maxInheritanceDepth = 100000;
5552 if (bcd->categoryOf()) // use class that is being extended in case of
5553 // an Objective-C category
5554 {
5555 bcd=bcd->categoryOf();
5556 }
5557 if (cd==bcd) return level;
5558 if (level==256)
5559 {
5560 warn_uncond("class {} seem to have a recursive inheritance relation!\n",cd->name());
5561 return -1;
5562 }
5563 int m=maxInheritanceDepth;
5564 for (const auto &bcdi : cd->baseClasses())
5565 {
5566 int mc=minClassDistance(bcdi.classDef,bcd,level+1);
5567 if (mc<m) m=mc;
5568 if (m<0) break;
5569 }
5570 return m;
5571}
5572
5574{
5575 if (bcd->categoryOf()) // use class that is being extended in case of
5576 // an Objective-C category
5577 {
5578 bcd=bcd->categoryOf();
5579 }
5580 if (cd==bcd)
5581 {
5582 goto exit;
5583 }
5584 if (level==256)
5585 {
5586 err("Internal inconsistency: found class {} seem to have a recursive "
5587 "inheritance relation! Please send a bug report to doxygen@gmail.com\n",cd->name());
5588 }
5589 else if (prot!=Protection::Private)
5590 {
5591 for (const auto &bcdi : cd->baseClasses())
5592 {
5593 Protection baseProt = classInheritedProtectionLevel(bcdi.classDef,bcd,bcdi.prot,level+1);
5594 if (baseProt==Protection::Private) prot=Protection::Private;
5595 else if (baseProt==Protection::Protected) prot=Protection::Protected;
5596 }
5597 }
5598exit:
5599 //printf("classInheritedProtectionLevel(%s,%s)=%d\n",qPrint(cd->name()),qPrint(bcd->name()),prot);
5600 return prot;
5601}
5602
5603
constexpr auto prefix
Definition anchor.cpp:44
std::vector< ArgumentList > ArgumentLists
Definition arguments.h:147
This class represents an function or template argument list.
Definition arguments.h:65
bool empty() const
Definition arguments.h:99
bool isSimple() const override
Definition classdef.cpp:720
bool isFortran() const override
Returns TRUE if this class is implemented in Fortran.
Definition classdef.cpp:686
QCString requiresClause() const override
Definition classdef.cpp:748
void writeTagFile(TextStream &ol) const override
Definition classdef.cpp:783
int countMemberDeclarations(MemberListType lt, const ClassDef *inheritedFrom, MemberListType lt2, bool invert, bool showAlways, ClassDefSet &visitedClasses) const override
Definition classdef.cpp:757
bool isSubClass(ClassDef *bcd, int level=0) const override
Returns TRUE iff bcd is a direct or indirect sub class of this class.
Definition classdef.cpp:655
const UsesClassList & usedByImplementationClasses() const override
Definition classdef.cpp:669
bool hasDetailedDescription() const override
returns TRUE if this class has a non-empty detailed description
Definition classdef.cpp:617
void writePageNavigation(OutputList &ol) const override
Definition classdef.cpp:779
ModuleDef * getModuleDef() const override
Returns the C++20 module in which this compound's definition can be found.
Definition classdef.cpp:649
void writeDocumentation(OutputList &ol) const override
Definition classdef.cpp:767
const UsesClassList & usedImplementationClasses() const override
Definition classdef.cpp:667
StringVector getQualifiers() const override
Definition classdef.cpp:750
void writeSummaryLinks(OutputList &ol) const override
Definition classdef.cpp:777
bool isVisibleInHierarchy() const override
the class is visible in a class diagram, or class hierarchy
Definition classdef.cpp:641
QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const override
Definition classdef.cpp:679
bool isPublished() const override
Returns TRUE if this class is marked as published.
Definition classdef.cpp:694
const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const override
Returns a dictionary of all members.
Definition classdef.cpp:633
QCString anchor() const override
Definition classdef.cpp:716
QCString title() const override
Definition classdef.cpp:728
bool isImplicitTemplateInstance() const override
Definition classdef.cpp:764
const FileList & usedFiles() const override
Definition classdef.cpp:732
CodeSymbolType codeSymbolType() const override
Definition classdef.cpp:599
bool isFinal() const override
Returns TRUE if this class is marked as final.
Definition classdef.cpp:690
const ExampleList & getExamples() const override
Definition classdef.cpp:736
void moveTo(Definition *) override
Definition classdef.cpp:597
bool isReference() const override
Definition classdef.cpp:609
bool isTemplateArgument() const override
Definition classdef.cpp:673
void updateSubClasses(const BaseClassList &) override
Update the list of sub classes to the one passed.
Definition classdef.cpp:796
bool isForwardDeclared() const override
Returns TRUE if this class represents a forward declaration of a template class.
Definition classdef.cpp:698
const ArgumentList & typeConstraints() const override
Definition classdef.cpp:734
const IncludeInfo * includeInfo() const override
Definition classdef.cpp:665
bool isAccessibleMember(const MemberDef *md) const override
returns TRUE iff md is a member of this class or of the the public/protected members of a base class
Definition classdef.cpp:657
QCString getSourceFileBase() const override
Definition classdef.cpp:605
void writeMemberPages(OutputList &ol) const override
Definition classdef.cpp:771
ClassDefAliasImpl(const Definition *newScope, const ClassDef *cd)
Definition classdef.cpp:586
void writeQuickMemberLinks(OutputList &ol, const MemberDef *md) const override
Definition classdef.cpp:775
void updateBaseClasses(const BaseClassList &) override
Update the list of base classes to the one passed.
Definition classdef.cpp:795
bool containsOverload(const MemberDef *md) const override
Definition classdef.cpp:752
bool subGrouping() const override
Definition classdef.cpp:742
const ArgumentList & templateArguments() const override
Returns the template arguments of this class.
Definition classdef.cpp:645
Protection protection() const override
Return the protection level (Public,Protected,Private) in which this compound was found.
Definition classdef.cpp:635
bool isCSharp() const override
Returns TRUE if this class is implemented in C#.
Definition classdef.cpp:688
const MemberGroupList & getMemberGroups() const override
Returns the member groups defined for this class.
Definition classdef.cpp:710
bool isEmbeddedInOuterScope() const override
Definition classdef.cpp:718
QCString getReference() const override
Definition classdef.cpp:607
int isBaseClass(const ClassDef *bcd, bool followInstances, const QCString &templSpec) const override
Returns TRUE iff bcd is a direct or indirect base class of this class.
Definition classdef.cpp:653
int countMembersIncludingGrouped(MemberListType lt, const ClassDef *inheritedFrom, bool additional) const override
Definition classdef.cpp:755
void addGroupedInheritedMembers(OutputList &ol, MemberListType lt, const ClassDef *inheritedFrom, const QCString &inheritId) const override
Definition classdef.cpp:791
bool isSealed() const override
Returns TRUE if this class is marked as sealed.
Definition classdef.cpp:692
bool hasDocumentation() const override
Definition classdef.cpp:615
FileDef * getFileDef() const override
Returns the namespace this compound is in, or 0 if it has a global scope.
Definition classdef.cpp:647
ArgumentLists getTemplateParameterLists() const override
Returns the template parameter lists that form the template declaration of this class.
Definition classdef.cpp:677
QCString getMemberListFileName() const override
Definition classdef.cpp:740
bool hasNonReferenceSuperClass() const override
Definition classdef.cpp:746
void writeInlineDocumentation(OutputList &ol) const override
Definition classdef.cpp:781
const BaseClassList & subClasses() const override
Returns the list of sub classes that directly derive from this class.
Definition classdef.cpp:631
bool isJavaEnum() const override
Definition classdef.cpp:726
QCString inheritanceGraphFileName() const override
returns the file name to use for the inheritance graph
Definition classdef.cpp:621
~ClassDefAliasImpl() override
Definition classdef.cpp:588
const TemplateInstanceList & getTemplateInstances() const override
Returns a sorted dictionary with all template instances found for this template class.
Definition classdef.cpp:659
QCString compoundTypeString() const override
Returns the type of compound as a string.
Definition classdef.cpp:627
bool isLinkableInProject() const override
Definition classdef.cpp:637
QCString displayName(bool includeScope=TRUE) const override
Definition classdef.cpp:623
QCString className() const override
Returns the name of the class including outer classes, but not including namespaces.
Definition classdef.cpp:704
bool isLocal() const override
Returns TRUE if this is a local class definition, see EXTRACT_LOCAL_CLASSES.
Definition classdef.cpp:611
QCString getInstanceOutputFileBase() const override
Definition classdef.cpp:603
void writeDocumentationForInnerClasses(OutputList &ol) const override
Definition classdef.cpp:769
const MemberLists & getMemberLists() const override
Returns the list containing the list of members sorted per type.
Definition classdef.cpp:708
MemberList * getMemberList(MemberListType lt) const override
Returns the members in the list identified by lt.
Definition classdef.cpp:706
ClassDef * categoryOf() const override
Returns the class of which this is a category (Objective-C only).
Definition classdef.cpp:702
const ClassDef * getCdAlias() const
Definition classdef.cpp:593
QCString collaborationGraphFileName() const override
returns the file name to use for the collaboration graph
Definition classdef.cpp:619
void writeMemberDeclarations(OutputList &ol, ClassDefSet &visitedClasses, MemberListType lt, const QCString &title, const QCString &subTitle=QCString(), bool showInline=FALSE, const ClassDef *inheritedFrom=nullptr, MemberListType lt2=MemberListType::Invalid(), bool invert=FALSE, bool showAlways=FALSE) const override
Definition classdef.cpp:785
QCString getOutputFileBase() const override
Definition classdef.cpp:601
CompoundType compoundType() const override
Returns the type of compound this is, i.e. class/struct/union/...
Definition classdef.cpp:625
const TemplateNameMap & getTemplateBaseClassNames() const override
Definition classdef.cpp:712
void writeDeclarationLink(OutputList &ol, bool &found, const QCString &header, bool localNames) const override
Definition classdef.cpp:761
const Definition * findInnerCompound(const QCString &name) const override
Definition classdef.cpp:675
DefType definitionType() const override
Definition classdef.cpp:591
QCString generatedFromFiles() const override
Definition classdef.cpp:730
bool isLinkable() const override
Definition classdef.cpp:639
const BaseClassList & baseClasses() const override
Returns the list of base classes from which this class directly inherits.
Definition classdef.cpp:629
const ClassDef * tagLessReference() const override
Definition classdef.cpp:722
bool isExtension() const override
Returns TRUE if this class represents an Objective-C 2.0 extension (nameless category).
Definition classdef.cpp:696
ClassLinkedRefMap getClasses() const override
returns the classes nested into this class
Definition classdef.cpp:613
const ConstraintClassList & templateTypeConstraints() const override
Definition classdef.cpp:671
bool isInterface() const override
Returns TRUE if this class represents an interface.
Definition classdef.cpp:700
std::unique_ptr< ClassDef > deepCopy(const QCString &name) const override
Definition classdef.cpp:594
bool isAbstract() const override
Returns TRUE if there is at least one pure virtual member in this class.
Definition classdef.cpp:682
bool hasExamples() const override
Definition classdef.cpp:738
bool visibleInParentsDeclList() const override
show this class in the declaration section of its parent?
Definition classdef.cpp:643
const MemberDef * getMemberByName(const QCString &s) const override
Returns the member with the given name.
Definition classdef.cpp:651
const ClassDef * templateMaster() const override
Returns the template master of which this class is an instance.
Definition classdef.cpp:661
bool isTemplate() const override
Returns TRUE if this class is a template.
Definition classdef.cpp:663
bool isSliceLocal() const override
Definition classdef.cpp:744
bool isUsedOnly() const override
Definition classdef.cpp:714
const MemberDef * isSmartPointer() const override
Definition classdef.cpp:724
bool isObjectiveC() const override
Returns TRUE if this class is implemented in Objective-C.
Definition classdef.cpp:684
void writeMemberList(OutputList &ol) const override
Definition classdef.cpp:773
A abstract class representing of a compound symbol.
Definition classdef.h:104
virtual int countMemberDeclarations(MemberListType lt, const ClassDef *inheritedFrom, MemberListType lt2, bool invert, bool showAlways, ClassDefSet &visitedClasses) const =0
virtual bool isSliceLocal() const =0
virtual ModuleDef * getModuleDef() const =0
Returns the C++20 module in which this compound's definition can be found.
virtual bool isAbstract() const =0
Returns TRUE if there is at least one pure virtual member in this class.
virtual bool isFinal() const =0
Returns TRUE if this class is marked as final.
virtual bool visibleInParentsDeclList() const =0
show this class in the declaration section of its parent?
virtual bool subGrouping() const =0
virtual void writeSummaryLinks(OutputList &ol) const =0
virtual bool hasDetailedDescription() const =0
returns TRUE if this class has a non-empty detailed description
virtual const ArgumentList & templateArguments() const =0
Returns the template arguments of this class.
virtual void writeMemberPages(OutputList &ol) const =0
virtual QCString compoundTypeString() const =0
Returns the type of compound as a string.
virtual bool isFortran() const =0
Returns TRUE if this class is implemented in Fortran.
virtual void writeDocumentation(OutputList &ol) const =0
virtual const MemberLists & getMemberLists() const =0
Returns the list containing the list of members sorted per type.
virtual QCString className() const =0
Returns the name of the class including outer classes, but not including namespaces.
virtual void writeMemberList(OutputList &ol) const =0
virtual bool isVisibleInHierarchy() const =0
the class is visible in a class diagram, or class hierarchy
virtual bool isTemplate() const =0
Returns TRUE if this class is a template.
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual bool isSealed() const =0
Returns TRUE if this class is marked as sealed.
virtual const MemberDef * getMemberByName(const QCString &) const =0
Returns the member with the given name.
virtual const TemplateInstanceList & getTemplateInstances() const =0
Returns a sorted dictionary with all template instances found for this template class.
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const QCString &templSpec=QCString()) const =0
Returns TRUE iff bcd is a direct or indirect base class of this class.
virtual ArgumentLists getTemplateParameterLists() const =0
Returns the template parameter lists that form the template declaration of this class.
virtual const UsesClassList & usedImplementationClasses() const =0
virtual bool isObjectiveC() const =0
Returns TRUE if this class is implemented in Objective-C.
virtual bool hasExamples() const =0
virtual QCString inheritanceGraphFileName() const =0
returns the file name to use for the inheritance graph
virtual StringVector getQualifiers() const =0
virtual bool isLocal() const =0
Returns TRUE if this is a local class definition, see EXTRACT_LOCAL_CLASSES.
virtual void writeQuickMemberLinks(OutputList &ol, const MemberDef *md) const =0
virtual bool isSimple() const =0
virtual Protection protection() const =0
Return the protection level (Public,Protected,Private) in which this compound was found.
virtual const ClassDef * tagLessReference() const =0
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual void writePageNavigation(OutputList &ol) const =0
virtual ClassDef * categoryOf() const =0
Returns the class of which this is a category (Objective-C only).
virtual QCString getInstanceOutputFileBase() const =0
virtual const MemberDef * isSmartPointer() const =0
virtual bool isExtension() const =0
Returns TRUE if this class represents an Objective-C 2.0 extension (nameless category).
virtual bool hasNonReferenceSuperClass() const =0
virtual bool isCSharp() const =0
Returns TRUE if this class is implemented in C#.
virtual bool isForwardDeclared() const =0
Returns TRUE if this class represents a forward declaration of a template class.
virtual QCString generatedFromFiles() const =0
virtual const ExampleList & getExamples() const =0
virtual bool isJavaEnum() const =0
virtual bool isSubClass(ClassDef *bcd, int level=0) const =0
Returns TRUE iff bcd is a direct or indirect sub class of this class.
virtual bool isTemplateArgument() const =0
virtual int countMembersIncludingGrouped(MemberListType lt, const ClassDef *inheritedFrom, bool additional) const =0
virtual const ArgumentList & typeConstraints() const =0
virtual bool isAccessibleMember(const MemberDef *md) const =0
returns TRUE iff md is a member of this class or of the the public/protected members of a base class
virtual QCString collaborationGraphFileName() const =0
returns the file name to use for the collaboration graph
virtual const TemplateNameMap & getTemplateBaseClassNames() const =0
virtual bool isPublished() const =0
Returns TRUE if this class is marked as published.
virtual const FileList & usedFiles() const =0
virtual void writeMemberDeclarations(OutputList &ol, ClassDefSet &visitedClasses, MemberListType lt, const QCString &title, const QCString &subTitle=QCString(), bool showInline=FALSE, const ClassDef *inheritedFrom=nullptr, MemberListType lt2=MemberListType::Invalid(), bool invert=FALSE, bool showAlways=FALSE) const =0
virtual QCString getMemberListFileName() const =0
virtual bool isEmbeddedInOuterScope() const =0
virtual void addGroupedInheritedMembers(OutputList &ol, MemberListType lt, const ClassDef *inheritedFrom, const QCString &inheritId) const =0
virtual const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const =0
Returns a dictionary of all members.
virtual void writeDeclarationLink(OutputList &ol, bool &found, const QCString &header, bool localNames) const =0
virtual const ConstraintClassList & templateTypeConstraints() const =0
virtual bool isImplicitTemplateInstance() const =0
virtual QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const =0
virtual const MemberGroupList & getMemberGroups() const =0
Returns the member groups defined for this class.
virtual const UsesClassList & usedByImplementationClasses() const =0
virtual const ClassDef * templateMaster() const =0
Returns the template master of which this class is an instance.
CompoundType
The various compound types.
Definition classdef.h:109
@ Singleton
Definition classdef.h:117
@ Interface
Definition classdef.h:112
@ Exception
Definition classdef.h:115
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e. class/struct/union/...
virtual bool containsOverload(const MemberDef *md) const =0
virtual ClassLinkedRefMap getClasses() const =0
returns the classes nested into this class
virtual bool isInterface() const =0
Returns TRUE if this class represents an interface.
virtual FileDef * getFileDef() const =0
Returns the namespace this compound is in, or 0 if it has a global scope.
virtual const IncludeInfo * includeInfo() const =0
virtual QCString requiresClause() const =0
virtual void writeInlineDocumentation(OutputList &ol) const =0
virtual void writeTagFile(TextStream &) const =0
virtual QCString title() const =0
virtual void writeDocumentationForInnerClasses(OutputList &ol) const =0
virtual const BaseClassList & subClasses() const =0
Returns the list of sub classes that directly derive from this class.
virtual bool isUsedOnly() const =0
Implementation of the ClassDef interface.
Definition classdef.cpp:197
bool isSubClass(ClassDef *bcd, int level=0) const override
Returns TRUE iff bcd is a direct or indirect sub class of this class.
bool addExample(const QCString &anchor, const QCString &name, const QCString &file) override
QCString getReference() const override
QCString getInstanceOutputFileBase() const override
TemplateInstanceList m_templateInstances
Definition classdef.cpp:499
void writeIncludeFilesForSlice(OutputList &ol) const
void overrideInheritanceGraph(CLASS_GRAPH_t e) override
ClassLinkedRefMap getClasses() const override
returns the classes nested into this class
QCString m_collabFileName
Definition classdef.cpp:431
ArgumentList m_typeConstraints
Definition classdef.cpp:468
void writePageNavigation(OutputList &ol) const override
void addMembersToMemberGroup() override
bool subGrouping() const override
void setMetaData(const QCString &md) override
void distributeMemberGroupDocumentation() override
void addMemberToList(MemberListType lt, MemberDef *md, bool isBrief)
bool isObjectiveC() const override
Returns TRUE if this class is implemented in Objective-C.
StringSet m_vhdlSummaryTitles
List of titles to use for the summary.
Definition classdef.cpp:543
QCString compoundTypeString() const override
Returns the type of compound as a string.
ExampleList m_examples
Definition classdef.cpp:474
void setImplicitTemplateInstance(bool b) override
void insertUsedFile(const FileDef *) override
QCString qualifiedNameWithTemplateParameters(const ArgumentLists *actualParams=nullptr, uint32_t *actualParamIndex=nullptr) const override
void writeTemplateSpec(OutputList &ol, const Definition *d, const QCString &type, SrcLangExt lang) const
void addUsedByClass(ClassDef *cd, const QCString &accessName, Protection prot) override
QCString m_fileName
Definition classdef.cpp:425
const MemberDef * m_arrowOperator
Does this class overloaded the -> operator?
Definition classdef.cpp:549
void addClassAttributes(OutputList &ol) const
void updateSubClasses(const BaseClassList &bcd) override
Update the list of sub classes to the one passed.
void addMemberToTemplateInstance(const MemberDef *md, const ArgumentList &templateArguments, const QCString &templSpec) override
MemberGroupList m_memberGroups
Definition classdef.cpp:517
TypeSpecifier m_spec
Definition classdef.cpp:556
ClassDef * m_categoryOf
Definition classdef.cpp:512
FileDef * getFileDef() const override
Returns the namespace this compound is in, or 0 if it has a global scope.
bool isTemplateArgument() const override
void writeInheritanceGraph(OutputList &ol) const
QCString className() const override
Returns the name of the class including outer classes, but not including namespaces.
const ClassDef * m_tagLessRef
Definition classdef.cpp:551
void setAnonymousEnumType() override
void setTagLessReference(const ClassDef *cd) override
Protection m_prot
Definition classdef.cpp:483
bool isLinkableInProject() const override
BaseClassList m_inheritedBy
Definition classdef.cpp:448
FileList m_files
Definition classdef.cpp:471
const TemplateInstanceList & getTemplateInstances() const override
Returns a sorted dictionary with all template instances found for this template class.
MemberLists m_memberLists
Definition classdef.cpp:514
const UsesClassList & usedByImplementationClasses() const override
ArgumentLists getTemplateParameterLists() const override
Returns the template parameter lists that form the template declaration of this class.
void writeMemberList(OutputList &ol) const override
void writeMemberDeclarations(OutputList &ol, ClassDefSet &visitedClasses, MemberListType lt, const QCString &title, const QCString &subTitle=QCString(), bool showInline=FALSE, const ClassDef *inheritedFrom=nullptr, MemberListType lt2=MemberListType::Invalid(), bool invert=FALSE, bool showAlways=FALSE) const override
void writeBriefDescription(OutputList &ol, bool exampleFlag) const
void writeInlineClasses(OutputList &ol) const
void moveTo(Definition *) override
Definition classdef.cpp:984
const ExampleList & getExamples() const override
UsesClassList m_usesImplClassList
Definition classdef.cpp:491
void addListReferences() override
const ArgumentList & templateArguments() const override
Returns the template arguments of this class.
QCString m_inheritFileName
Definition classdef.cpp:434
void writeDetailedDocumentationBody(OutputList &ol) const
ClassDefImpl(const QCString &fileName, int startLine, int startColumn, const QCString &name, CompoundType ct, const QCString &ref=QCString(), const QCString &fName=QCString(), bool isSymbol=TRUE, bool isJavaEnum=FALSE)
Definition classdef.cpp:811
QCString generatedFromFiles() const override
const ClassDef * m_templateMaster
Definition classdef.cpp:504
void writeTagFile(TextStream &) const override
void endMemberDeclarations(OutputList &ol) const
bool m_membersMerged
Definition classdef.cpp:526
const MemberGroupList & getMemberGroups() const override
Returns the member groups defined for this class.
void sortMemberLists() override
const FileList & usedFiles() const override
void insertExplicitTemplateInstance(ClassDef *instance, const QCString &spec) override
void setTemplateArguments(const ArgumentList &al) override
void mergeCategory(ClassDef *category) override
void countMembers() override
void setClassSpecifier(TypeSpecifier spec) override
const MemberDef * getMemberByName(const QCString &) const override
Returns the member with the given name.
void reclassifyMember(MemberDefMutable *md, MemberType t) override
int countAdditionalInheritedMembers() const
void writePlainMemberDeclaration(OutputList &ol, MemberListType lt, bool inGroup, int indentLevel, const ClassDef *inheritedFrom, const QCString &inheritId) const
bool isFinal() const override
Returns TRUE if this class is marked as final.
void insertSubClass(ClassDef *, Protection p, Specifier s, const QCString &t=QCString()) override
void writeDocumentationForInnerClasses(OutputList &ol) const override
bool isUsedOnly() const override
QCString m_requiresClause
C++20 requires clause.
Definition classdef.cpp:561
void addQualifiers(const StringVector &qualifiers) override
void setTypeConstraints(const ArgumentList &al) override
bool isInterface() const override
Returns TRUE if this class represents an interface.
void writeSimpleMemberDocumentation(OutputList &ol, MemberListType lt) const
int countMemberDeclarations(MemberListType lt, const ClassDef *inheritedFrom, MemberListType lt2, bool invert, bool showAlways, ClassDefSet &visitedClasses) const override
void writeInlineDocumentation(OutputList &ol) const override
Write class documentation inside another container (i.e. a group).
int countMembersIncludingGrouped(MemberListType lt, const ClassDef *inheritedFrom, bool additional) const override
bool isLocal() const override
Returns TRUE if this is a local class definition, see EXTRACT_LOCAL_CLASSES.
const BaseClassList & baseClasses() const override
Returns the list of base classes from which this class directly inherits.
void writeCollaborationGraph(OutputList &ol) const
void writeDeclarationLink(OutputList &ol, bool &found, const QCString &header, bool localNames) const override
void setRequiresClause(const QCString &req) override
void writeAuthorSection(OutputList &ol) const
void writeDetailedDescription(OutputList &ol, const QCString &pageType, bool exampleFlag, const QCString &title, const QCString &anchor=QCString()) const
TemplateNameMap m_templBaseClassNames
Definition classdef.cpp:501
const ConstraintClassList & templateTypeConstraints() const override
const UsesClassList & usedImplementationClasses() const override
std::unique_ptr< IncludeInfo > m_incInfo
Definition classdef.cpp:439
ClassDef * categoryOf() const override
Returns the class of which this is a category (Objective-C only).
bool isReference() const override
bool isPublished() const override
Returns TRUE if this class is marked as published.
bool m_isJavaEnum
Does this class represent a Java style enum?
Definition classdef.cpp:554
void addGroupedInheritedMembers(OutputList &ol, MemberListType lt, const ClassDef *inheritedFrom, const QCString &inheritId) const override
bool isFortran() const override
Returns TRUE if this class is implemented in Fortran.
BaseClassList m_inherits
Definition classdef.cpp:444
void writeMemberPages(OutputList &ol) const override
MemberNameInfoLinkedMap m_allMemberNameInfoLinkedMap
Definition classdef.cpp:462
void makeTemplateArgument(bool b=TRUE) override
void endMemberDocumentation(OutputList &ol) const
void writeDocumentation(OutputList &ol) const override
void writeMoreLink(OutputList &ol, const QCString &anchor) const
void setModuleDef(ModuleDef *mod) override
const BaseClassList & subClasses() const override
Returns the list of sub classes that directly derive from this class.
std::unique_ptr< ClassDef > deepCopy(const QCString &name) const override
Definition classdef.cpp:873
bool isSimple() const override
ModuleDef * m_moduleDef
Definition classdef.cpp:459
void hideDerivedVariablesInPython(ClassDefMutable *cls)
void addUsedInterfaceClasses(MemberDef *md, const QCString &typeStr)
bool hasCollaborationGraph() const override
void writeInheritedMemberDeclarations(OutputList &ol, ClassDefSet &visitedClasses, MemberListType lt, MemberListType lt2, const QCString &title, const ClassDef *inheritedFrom, bool invert, bool showAlways) const
void writeQuickMemberLinks(OutputList &ol, const MemberDef *md) const override
bool containsOverload(const MemberDef *md) const override
void getTitleForMemberListType(MemberListType type, QCString &title, QCString &subtitle) const
bool isJavaEnum() const override
void setCompoundType(CompoundType t) override
void insertMember(MemberDef *) override
int countInheritedDecMembers(MemberListType lt, const ClassDef *inheritedFrom, bool invert, bool showAlways, ClassDefSet &visitedClasses) const
bool m_isSimple
Is this a simple (non-nested) C structure?
Definition classdef.cpp:546
const ClassDef * tagLessReference() const override
bool isForwardDeclared() const override
Returns TRUE if this class represents a forward declaration of a template class.
CLASS_GRAPH_t m_typeInheritanceGraph
Definition classdef.cpp:566
int countInheritanceNodes() const
void setTemplateBaseClassNames(const TemplateNameMap &templateNames) override
void findSectionsInDocumentation() override
bool isTemplate() const override
Returns TRUE if this class is a template.
int countInheritsNodes() const
void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const QCString &templSpec) override
void mergeMembersFromBaseClasses(bool mergeVirtualBaseClass)
const MemberNameInfoLinkedMap & memberNameInfoLinkedMap() const override
Returns a dictionary of all members.
bool m_isAbstract
Definition classdef.cpp:520
StringVector m_qualifiers
Definition classdef.cpp:563
ArgumentList m_primaryConstructorParams
Definition classdef.cpp:570
FileDef * m_fileDef
Definition classdef.cpp:456
const ClassDef * templateMaster() const override
Returns the template master of which this class is an instance.
const TemplateNameMap & getTemplateBaseClassNames() const override
ClassDef::CompoundType m_compType
Definition classdef.cpp:477
bool m_hasCollaborationGraph
Definition classdef.cpp:565
bool isExtension() const override
Returns TRUE if this class represents an Objective-C 2.0 extension (nameless category).
void addTypeConstraint(const QCString &typeConstraint, const QCString &type)
void setIncludeFile(FileDef *fd, const QCString &incName, bool local, bool force) override
bool isAbstract() const override
Returns TRUE if there is at least one pure virtual member in this class.
QCString getOutputFileBase() const override
void setGroupDefForAllMembers(GroupDef *g, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs) override
const IncludeInfo * includeInfo() const override
void setCategoryOf(ClassDef *cd) override
QCString m_className
Definition classdef.cpp:507
void addUsedClass(ClassDef *cd, const QCString &accessName, Protection prot) override
void addTypeConstraints() override
void setClassName(const QCString &name) override
QCString title() const override
bool visibleInParentsDeclList() const override
show this class in the declaration section of its parent?
const MemberLists & getMemberLists() const override
Returns the list containing the list of members sorted per type.
void overrideCollaborationGraph(bool e) override
bool isSealed() const override
Returns TRUE if this class is marked as sealed.
ClassLinkedRefMap m_innerClasses
Definition classdef.cpp:488
UsesClassList m_usedByImplClassList
Definition classdef.cpp:492
bool isSliceLocal() const override
ConstraintClassList m_constraintClassList
Definition classdef.cpp:494
void setIsStatic(bool b) override
int countInheritedByNodes() const
QCString getMemberListFileName() const override
Definition classdef.cpp:998
void setFileDef(FileDef *fd) override
void insertBaseClass(ClassDef *, const QCString &name, Protection p, Specifier s, const QCString &t=QCString()) override
bool m_isTemplArg
Definition classdef.cpp:531
DefType definitionType() const override
Definition classdef.cpp:204
CodeSymbolType codeSymbolType() const override
QCString collaborationGraphFileName() const override
returns the file name to use for the collaboration graph
bool m_usedOnly
Reason of existence is a "use" relation.
Definition classdef.cpp:540
bool isCSharp() const override
Returns TRUE if this class is implemented in C#.
void computeAnchors() override
void writeIncludeFiles(OutputList &ol) const
void addRequirementReferences() override
QCString m_metaData
Definition classdef.cpp:558
QCString anchor() const override
void addInnerCompound(Definition *d) override
void setSubGrouping(bool enabled) override
void mergeMembers() override
void writeSummaryLinks(OutputList &ol) const override
void writeMemberGroups(OutputList &ol, bool showInline=FALSE) const
int isBaseClass(const ClassDef *bcd, bool followInstances, const QCString &templSpec) const override
Returns TRUE iff bcd is a direct or indirect base class of this class.
QCString requiresClause() const override
void writeAdditionalInheritedMembers(OutputList &ol) const
void writeNestedClasses(OutputList &ol, const QCString &title) const
void removeMemberFromLists(MemberDef *md) override
QCString displayName(bool includeScope=TRUE) const override
bool isVisibleInHierarchy() const override
void writeMemberDocumentation(OutputList &ol, MemberListType lt, const QCString &title, bool showInline=FALSE) const
QCString m_memberListFileName
Definition classdef.cpp:428
bool isLinkable() const override
bool m_implicitTemplateInstance
Definition classdef.cpp:568
bool hasDocumentation() const override
ModuleDef * getModuleDef() const override
Returns the C++20 module in which this compound's definition can be found.
ArgumentList m_tempArgs
Definition classdef.cpp:465
void internalInsertMember(MemberDef *md, Protection prot, bool addToAllList)
void startMemberDeclarations(OutputList &ol) const
bool m_subGrouping
Definition classdef.cpp:537
void writeDocumentationContents(OutputList &ol, const QCString &pageTitle) const
bool hasExamples() const override
StringVector getQualifiers() const override
const MemberDef * isSmartPointer() const override
void updateBaseClasses(const BaseClassList &bcd) override
Update the list of base classes to the one passed.
CLASS_GRAPH_t hasInheritanceGraph() const override
MemberList * getMemberList(MemberListType lt) const override
Returns the members in the list identified by lt.
void setUsedOnly(bool b) override
Protection protection() const override
Return the protection level (Public,Protected,Private) in which this compound was found.
const ArgumentList & typeConstraints() const override
void showUsedFiles(OutputList &ol) const
const Definition * findInnerCompound(const QCString &name) const override
ClassDef * insertTemplateInstance(const QCString &fileName, int startLine, int startColumn, const QCString &templSpec, bool &freshInstance) override
bool isEmbeddedInOuterScope() const override
void sortAllMembersList() override
CompoundType compoundType() const override
Returns the type of compound this is, i.e. class/struct/union/...
bool isAccessibleMember(const MemberDef *md) const override
returns TRUE iff md is a member of this class or of the the public/protected members of a base class
bool isImplicitTemplateInstance() const override
bool hasNonReferenceSuperClass() const override
void setTemplateMaster(const ClassDef *tm) override
QCString inheritanceGraphFileName() const override
returns the file name to use for the inheritance graph
void setPrimaryConstructorParams(const ArgumentList &list) override
void startMemberDocumentation(OutputList &ol) const
QCString getSourceFileBase() const override
void setProtection(Protection p) override
bool hasDetailedDescription() const override
returns TRUE if this class has a non-empty detailed description
virtual void setGroupDefForAllMembers(GroupDef *g, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs)=0
virtual void setTemplateArguments(const ArgumentList &al)=0
virtual void setTemplateMaster(const ClassDef *tm)=0
virtual void setImplicitTemplateInstance(bool b)=0
virtual void addMemberToTemplateInstance(const MemberDef *md, const ArgumentList &templateArguments, const QCString &templSpec)=0
virtual void setUsedOnly(bool b)=0
virtual void setCategoryOf(ClassDef *cd)=0
virtual void addMembersToTemplateInstance(const ClassDef *cd, const ArgumentList &templateArguments, const QCString &templSpec)=0
virtual void mergeMembers()=0
Class representing a built-in class diagram.
Definition diagram.h:31
const QCString & name() const override
const Definition * getAlias() const
const Definition * getScope() const
DefinitionAliasMixin(const Definition *scope, const Definition *alias)
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual QCString docFile() const =0
virtual const QCString & localName() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual QCString getDefFileName() const =0
virtual bool isLinkable() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual QCString anchor() const =0
virtual int inbodyLine() const =0
virtual int briefLine() const =0
virtual bool hasDocumentation() const =0
virtual bool isLinkableInProject() const =0
virtual QCString briefDescription(bool abbreviate=FALSE) const =0
virtual bool isAnonymous() const =0
virtual bool isHidden() const =0
virtual const Definition * findInnerCompound(const QCString &name) const =0
virtual QCString getReference() const =0
virtual QCString getSourceFileBase() const =0
virtual QCString documentation() const =0
virtual QCString qualifiedName() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual bool isArtificial() const =0
virtual QCString briefFile() const =0
virtual CodeSymbolType codeSymbolType() const =0
virtual QCString getOutputFileBase() const =0
virtual Definition * getOuterScope() const =0
virtual bool isReference() const =0
virtual QCString inbodyDocumentation() const =0
virtual QCString inbodyFile() const =0
virtual const QCString & name() const =0
bool isReference() const override
const QCString & name() const override
void writeSourceDef(OutputList &ol) const override
QCString inbodyFile() const override
QCString getDefFileName() const override
void writeNavigationPath(OutputList &ol) const override
bool hasBriefDescription() const override
QCString docFile() const override
bool hasRequirementRefs() const override
QCString briefFile() const override
QCString qualifiedName() const override
QCString id() const override
void setOuterScope(Definition *def) override
void setReference(const QCString &r) override
void writeRequirementRefs(OutputList &ol) const override
QCString getSourceFileBase() const override
const RefItemVector & xrefListItems() const override
QCString briefDescription(bool abbreviate=FALSE) const override
Definition * getOuterScope() const override
QCString getReference() const override
DefinitionMixin(const QCString &defFileName, int defLine, int defColumn, const QCString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=TRUE)
const QCString & localName() const override
const GroupList & partOfGroups() const override
const FileDef * getBodyDef() const override
int getStartBodyLine() const override
QCString inbodyDocumentation() const override
QCString documentation() const override
void writeDocAnchorsToTagFile(TextStream &fs) const override
bool hasDocumentation() const override
SrcLangExt getLanguage() const override
virtual void setHidden(bool b)=0
virtual void addInnerCompound(Definition *d)=0
virtual void setLanguage(SrcLangExt lang)=0
virtual void setOuterScope(Definition *d)=0
virtual void setArtificial(bool b)=0
Representation of a class inheritance or dependency graph.
bool isTooBig() const
bool isTrivial() const
int numNodes() const
static bool suppressDocWarnings
Definition doxygen.h:130
static ClassLinkedMap * classLinkedMap
Definition doxygen.h:95
static NamespaceDefMutable * globalScope
Definition doxygen.h:121
static ClassLinkedMap * hiddenClassLinkedMap
Definition doxygen.h:96
static bool generatingXmlOutput
Definition doxygen.h:134
static MemberNameLinkedMap * memberNameLinkedMap
Definition doxygen.h:111
A model of a file symbol.
Definition filedef.h:99
Minimal replacement for QFileInfo.
Definition fileinfo.h:23
bool exists() const
Definition fileinfo.cpp:30
std::string absFilePath() const
Definition fileinfo.cpp:101
A model of a group of symbols.
Definition groupdef.h:52
virtual bool addClass(ClassDef *def)=0
virtual bool insertMember(MemberDef *def, bool docOnly=FALSE)=0
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1437
bool del(const QCString &key)
Definition linkedmap.h:183
T * add(const char *k, Args &&... args)
Definition linkedmap.h:90
const T * find(const std::string &key) const
Definition linkedmap.h:47
A model of a class/file/namespace member symbol.
Definition memberdef.h:48
virtual QCString typeString() const =0
virtual bool isSignal() const =0
virtual bool isDestructor() const =0
virtual bool isExplicit() const =0
virtual bool isObjCMethod() const =0
virtual bool isMaybeVoid() const =0
virtual bool isConstructor() const =0
virtual bool isFriend() const =0
virtual bool isRelated() const =0
virtual const ClassDef * getClassDef() const =0
virtual bool isOverride() const =0
virtual bool isTypedef() const =0
virtual ClassDef * category() const =0
virtual bool isSlot() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isInline() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isMaybeAmbiguous() const =0
virtual VhdlSpecifier getVhdlSpecifiers() const =0
virtual bool isFunction() const =0
virtual bool isAttribute() const =0
virtual int getMemberGroupId() const =0
virtual bool isStatic() const =0
virtual bool isMaybeDefault() const =0
virtual bool isRemovable() const =0
virtual bool isConstrained() const =0
virtual bool isReadonly() const =0
virtual bool isBound() const =0
virtual bool isThreadLocal() const =0
virtual std::unique_ptr< MemberDef > createTemplateInstanceMember(const ArgumentList &formalArgs, const std::unique_ptr< ArgumentList > &actualArgs) const =0
virtual const ClassDef * getClassDefOfAnonymousType() const =0
virtual bool isTransient() const =0
virtual Protection protection() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isOptional() const =0
virtual bool isEnumerate() const =0
virtual MemberType memberType() const =0
virtual std::unique_ptr< MemberDef > deepCopy() const =0
virtual QCString memberTypeName() const =0
virtual bool isVariable() const =0
virtual QCString argsString() const =0
virtual Specifier virtualness(int count=0) const =0
virtual bool isUNOProperty() const =0
virtual bool isFinal() const =0
virtual bool isMutable() const =0
virtual bool isEnumValue() const =0
virtual void setMemberType(MemberType t)=0
virtual void setSectionList(const Definition *container, const MemberList *sl)=0
virtual void setCategory(ClassDef *)=0
virtual void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const QCString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr)=0
virtual void setCategoryRelation(const MemberDef *)=0
A list of MemberDef objects as shown in documentation sections.
Definition memberlist.h:125
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.
void writeTagFile(TextStream &, bool useQualifiedName=false, bool showNamespaceMembers=true)
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
void writeSimpleDocumentation(OutputList &ol, const Definition *container) const
MemberListType listType() const
Definition memberlist.h:130
void writeDocumentation(OutputList &ol, const QCString &scopeName, const Definition *container, const QCString &title, const QCString &anchor, bool showEnumValues=FALSE, bool showInline=FALSE) const
int numDecMembers(const ClassDef *inheritedFrom) const
Definition memberlist.h:133
bool declVisible() const
Wrapper class for the MemberListType type.
Definition types.h:346
constexpr const char * toLabel() const noexcept
Definition types.h:402
constexpr bool isInvalid() const noexcept
Definition types.h:372
static constexpr MemberListType Invalid() noexcept
Definition types.h:371
void push_back(Ptr &&p)
Definition membername.h:54
bool empty() const
Definition membername.h:135
void push_back(Ptr &&p)
Definition membername.h:141
iterator begin()
Definition membername.h:131
iterator end()
Definition membername.h:132
typename Vec::iterator iterator
Definition membername.h:125
iterator erase(iterator pos)
Definition membername.h:142
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:315
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md, int sectionLevel=-1)
Definition outputlist.h:383
void endTextBlock(bool paraBreak=FALSE)
Definition outputlist.h:672
void endIndent()
Definition outputlist.h:584
void writeString(const QCString &text)
Definition outputlist.h:411
void startMemberDeclaration()
Definition outputlist.h:569
void startMemberDoc(const QCString &clName, const QCString &memName, const QCString &anchor, const QCString &title, int memCount, int memTotal, bool showInline)
Definition outputlist.h:531
void startMemberDocName(bool align)
Definition outputlist.h:680
void startClassDiagram()
Definition outputlist.h:594
void startItemList()
Definition outputlist.h:429
void disable(OutputType o)
void endMemberDocName()
Definition outputlist.h:682
void endMemberDoc(bool hasArgs)
Definition outputlist.h:535
void writeRuler()
Definition outputlist.h:521
void startGroupHeader(const QCString &id=QCString(), int extraLevels=0)
Definition outputlist.h:453
void enable(OutputType o)
void endContents()
Definition outputlist.h:620
void endMemberDescription()
Definition outputlist.h:567
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition outputlist.h:439
void startMemberDescription(const QCString &anchor, const QCString &inheritId=QCString(), bool typ=false)
Definition outputlist.h:565
void endCompoundTemplateParams()
Definition outputlist.h:503
void docify(const QCString &s)
Definition outputlist.h:437
void generateDoc(const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &docStr, const DocOptions &options)
void startIndent()
Definition outputlist.h:582
void startParagraph(const QCString &classDef=QCString())
Definition outputlist.h:407
void endDescForItem()
Definition outputlist.h:549
void startTextBlock(bool dense=FALSE)
Definition outputlist.h:670
void endExamples()
Definition outputlist.h:580
void endParagraph()
Definition outputlist.h:409
void addIndexItem(const QCString &s1, const QCString &s2)
Definition outputlist.h:590
void startExamples()
Definition outputlist.h:578
void startMemberSections()
Definition outputlist.h:461
void startMemberList()
Definition outputlist.h:481
void endTextLink()
Definition outputlist.h:444
void startItemListItem()
Definition outputlist.h:457
void endItemListItem()
Definition outputlist.h:459
void startBold()
Definition outputlist.h:561
void endMemberItem(OutputGenerator::MemberItemType type)
Definition outputlist.h:495
void writeSynopsis()
Definition outputlist.h:592
void startTypewriter()
Definition outputlist.h:449
void pushGeneratorState()
void insertMemberAlign(bool templ=FALSE)
Definition outputlist.h:517
void startDescForItem()
Definition outputlist.h:547
void disableAllBut(OutputType o)
void popGeneratorState()
void writeSummaryLink(const QCString &file, const QCString &anchor, const QCString &title, bool first)
Definition outputlist.h:614
void writeAnchor(const QCString &fileName, const QCString &name)
Definition outputlist.h:523
void endBold()
Definition outputlist.h:563
void endGroupHeader(int extraLevels=0)
Definition outputlist.h:455
void endClassDiagram(const ClassDiagram &d, const QCString &f, const QCString &n)
Definition outputlist.h:596
void endLabels()
Definition outputlist.h:742
void endQuickIndices()
Definition outputlist.h:604
void writePageOutline()
Definition outputlist.h:616
void endDotGraph(DotClassGraph &g)
Definition outputlist.h:650
void endItemList()
Definition outputlist.h:431
void startDotGraph()
Definition outputlist.h:648
void writeLabel(const QCString &l, bool isLast)
Definition outputlist.h:740
void startLabels()
Definition outputlist.h:738
void startContents()
Definition outputlist.h:618
void startCompoundTemplateParams()
Definition outputlist.h:501
void endMemberDeclaration(const QCString &anchor, const QCString &inheritId)
Definition outputlist.h:571
void enableAll()
void endMemberHeader()
Definition outputlist.h:471
void startMemberItem(const QCString &anchor, OutputGenerator::MemberItemType type, const QCString &id=QCString())
Definition outputlist.h:493
void endTypewriter()
Definition outputlist.h:451
void lineBreak(const QCString &style=QCString())
Definition outputlist.h:559
void parseText(const QCString &textStr)
void startTextLink(const QCString &file, const QCString &anchor)
Definition outputlist.h:442
void startMemberHeader(const QCString &anchor, int typ=2)
Definition outputlist.h:469
void endMemberSections()
Definition outputlist.h:463
This is an alternative implementation of QCString.
Definition qcstring.h:103
int find(char c, int index=0, bool cs=TRUE) const
Definition qcstring.cpp:43
QCString & prepend(const char *s)
Definition qcstring.h:426
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:170
bool startsWith(const char *s) const
Definition qcstring.h:511
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:245
QCString lower() const
Definition qcstring.h:253
bool endsWith(const char *s) const
Definition qcstring.h:528
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:167
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:264
QCString right(size_t len) const
Definition qcstring.h:238
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition qcstring.cpp:96
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition qcstring.h:176
QCString left(size_t len) const
Definition qcstring.h:233
void clear()
Definition qcstring.h:186
static RequirementManager & instance()
void addRequirementRefsForSymbol(const Definition *symbol)
ClassDefMutable * resolveClassMutable(const Definition *scope, const QCString &name, bool mayBeUnlinkable=false, bool mayBeHidden=false)
Wrapper around resolveClass that returns a mutable interface to the class object or a nullptr if the ...
Implements TextGeneratorIntf for an OutputDocInterface stream.
Definition util.h:77
Text streaming class that buffers data.
Definition textstream.h:36
Wrapper class for a number of boolean properties.
Definition types.h:694
@ ARCHITECTURECLASS
Definition vhdldocgen.h:77
static QCString getClassName(const ClassDef *)
static QCString getProtectionName(int prot)
static void writeInlineClassLink(const ClassDef *, OutputList &ol)
static void writeVhdlDeclarations(const MemberList *, OutputList &, const GroupDef *, const ClassDef *, const FileDef *, const NamespaceDef *, const ModuleDef *)
static VhdlClasses convert(Protection prot)
Definition vhdldocgen.h:80
static QCString getClassTitle(const ClassDef *)
static QCString makeQualifiedNameWithTemplateParameters(const ClassDef *cd, const ArgumentLists *actualParams, uint32_t *actualParamIndex)
Definition classdef.cpp:56
static QCString getCompoundTypeString(SrcLangExt lang, ClassDef::CompoundType compType, bool isJavaEnum)
Definition classdef.cpp:158
ClassDefMutable * toClassDefMutable(Definition *d)
static bool hasNonReferenceSuperClassRec(const ClassDef *cd, int level)
static QCString makeDisplayName(const ClassDef *cd, bool includeScope)
Definition classdef.cpp:107
int minClassDistance(const ClassDef *cd, const ClassDef *bcd, int level)
static bool isStandardFunc(const MemberDef *md)
ClassDef * getClass(const QCString &n)
std::unique_ptr< ClassDef > createClassDefAlias(const Definition *newScope, const ClassDef *cd)
Definition classdef.cpp:799
static void writeInheritanceSpecifier(OutputList &ol, const BaseClassDef &bcd)
bool classHasVisibleRoot(const BaseClassList &bcl)
std::unique_ptr< ClassDef > createClassDef(const QCString &fileName, int startLine, int startColumn, const QCString &name, ClassDef::CompoundType ct, const QCString &ref, const QCString &fName, bool isSymbol, bool isJavaEnum)
Factory method to create a new ClassDef object.
Definition classdef.cpp:573
static void searchTemplateSpecs(const Definition *d, ArgumentLists &result, QCString &name, SrcLangExt lang)
bool classVisibleInIndex(const ClassDef *cd)
ClassDef * toClassDef(Definition *d)
Protection classInheritedProtectionLevel(const ClassDef *cd, const ClassDef *bcd, Protection prot, int level)
bool classHasVisibleChildren(const ClassDef *cd)
std::vector< BaseClassDef > BaseClassList
Definition classdef.h:81
std::unordered_set< const ClassDef * > ClassDefSet
Definition classdef.h:95
std::map< std::string, int > TemplateNameMap
Definition classdef.h:93
std::vector< TemplateInstanceDef > TemplateInstanceList
Definition classdef.h:91
#define Config_getInt(name)
Definition config.h:34
#define Config_getList(name)
Definition config.h:38
#define Config_getBool(name)
Definition config.h:33
#define Config_getString(name)
Definition config.h:32
#define Config_getEnum(name)
Definition config.h:35
#define NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
std::set< std::string > StringSet
Definition containers.h:31
std::vector< std::string > StringVector
Definition containers.h:33
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const QCString &argsString, QCString *extraTypeChars=nullptr)
Definition defargs.l:826
Definition * toDefinition(DefinitionMutable *dm)
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:49
#define AUTO_TRACE(...)
Definition docnode.cpp:48
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:50
void docFindSections(const QCString &input, const Definition *d, const QCString &fileName)
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const QCString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const QCString &input, const DocOptions &options)
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:55
@ Collaboration
Definition dotgraph.h:31
@ Inheritance
Definition dotgraph.h:31
static bool isSpecialization(const ArgumentLists &srcTempArgLists, const ArgumentLists &dstTempArgLists)
Definition doxygen.cpp:6100
static void writeTagFile()
QCString includeClose(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:85
QCString includeStatement(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:55
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:1966
QCString includeOpen(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:72
@ IncludeLocal
Definition filedef.h:50
@ IncludeSystem
Definition filedef.h:49
void startTitle(OutputList &ol, const QCString &fileName, const DefinitionMutable *def)
Definition index.cpp:386
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
Definition index.cpp:429
void endTitle(OutputList &ol, const QCString &fileName, const QCString &name)
Definition index.cpp:396
void startFile(OutputList &ol, const QCString &name, bool isSource, const QCString &manName, const QCString &title, HighlightedItem hli, bool additionalIndices, const QCString &altSidebarName, int hierarchyLevel, const QCString &allMembersFile)
Definition index.cpp:403
void endFileWithNavPath(OutputList &ol, const DefinitionMutable *d, bool showPageNavigation)
Definition index.cpp:450
HighlightedItem
Definition index.h:59
@ InterfaceVisible
Definition index.h:89
@ ExceptionVisible
Definition index.h:91
Translator * theTranslator
Definition language.cpp:71
MemberDefMutable * toMemberDefMutable(Definition *d)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
#define warn_uncond(fmt,...)
Definition message.h:122
#define warn(file, line, fmt,...)
Definition message.h:97
#define msg(fmt,...)
Definition message.h:94
#define err(fmt,...)
Definition message.h:127
ModuleDef * toModuleDef(Definition *d)
int qstricmp(const char *s1, const char *s2)
Definition qcstring.cpp:530
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:571
#define TRUE
Definition qcstring.h:37
#define FALSE
Definition qcstring.h:34
Web server based search engine.
This class contains the information about the argument of a function or template.
Definition arguments.h:27
QCString type
Definition arguments.h:42
QCString name
Definition arguments.h:44
QCString defval
Definition arguments.h:46
Class that contains information about an inheritance relation.
Definition classdef.h:55
ClassDef * classDef
Class definition that this relation inherits from.
Definition classdef.h:60
QCString templSpecifiers
Template arguments used for the base class.
Definition classdef.h:78
Specifier virt
Virtualness of the inheritance relation: Normal, or Virtual.
Definition classdef.h:75
Protection prot
Protection level of the inheritance relation: Public, Protected, or Private.
Definition classdef.h:70
Data associated with an example.
Definition example.h:29
GroupPri_t
Grouping priority.
Definition types.h:230
Class representing the data associated with a #include statement.
Definition filedef.h:75
Represents of a member declaration list with configurable title and subtitle.
Definition layout.h:112
QCString title(SrcLangExt lang) const
Definition layout.cpp:1788
MemberListType type
Definition layout.h:118
QCString subtitle(SrcLangExt lang) const
Definition layout.cpp:1793
Represents of a member definition list with configurable title.
Definition layout.h:132
MemberListType type
Definition layout.h:137
QCString title(SrcLangExt lang) const
Definition layout.cpp:1800
Definition layout.h:102
QCString title(SrcLangExt lang) const
Definition layout.cpp:1781
This file contains a number of basic enums and types.
CodeSymbolType
Definition types.h:481
MemberType
Definition types.h:569
Protection
Definition types.h:32
SrcLangExt
Definition types.h:207
Specifier
Definition types.h:80
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const QCString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const QCString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
Definition util.cpp:2031
QCString removeRedundantWhiteSpace(const QCString &s)
Definition util.cpp:567
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
Definition util.cpp:5253
QCString insertTemplateSpecifierInScope(const QCString &scope, const QCString &templ)
Definition util.cpp:3785
bool protectionLevelVisible(Protection prot)
Definition util.cpp:5977
QCString convertToHtml(const QCString &s, bool keepEntities)
Definition util.cpp:4006
void writeTypeConstraints(OutputList &ol, const Definition *d, const ArgumentList &al)
Definition util.cpp:5501
QCString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
Definition util.cpp:1299
void addRefItem(const RefItemVector &sli, const QCString &key, const QCString &prefix, const QCString &name, const QCString &title, const QCString &args, const Definition *scope)
Definition util.cpp:4867
void addGroupListToTitle(OutputList &ol, const Definition *d)
Definition util.cpp:4954
QCString demangleCSharpGenericName(const QCString &name, const QCString &templArgs)
Definition util.cpp:6963
QCString removeAnonymousScopes(const QCString &str)
Definition util.cpp:161
void createSubDirs(const Dir &d)
Definition util.cpp:3679
QCString stripScope(const QCString &name)
Definition util.cpp:3818
QCString inlineTemplateArgListToDoc(const ArgumentList &al)
Definition util.cpp:1227
QCString stripExtension(const QCString &fName)
Definition util.cpp:4986
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:298
QCString convertNameToFile(const QCString &name, bool allowDots, bool allowUnderscore)
Definition util.cpp:3543
QCString convertToXML(const QCString &s, bool keepEntities, const bool citeEntry)
Definition util.cpp:3951
EntryType guessSection(const QCString &name)
Definition util.cpp:338
void convertProtectionLevel(MemberListType inListType, Protection inProt, MemberListType *outListType1, MemberListType *outListType2)
Computes for a given list type inListType, which are the the corresponding list type(s) in the base c...
Definition util.cpp:6269
QCString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
Definition util.cpp:1254
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5937
void linkifyText(const TextGeneratorIntf &out, const QCString &text, const LinkifyTextOptions &options)
Definition util.cpp:893
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
Definition util.cpp:1124
QCString convertToId(const QCString &s)
Definition util.cpp:3911
void writeExamples(OutputList &ol, const ExampleList &list)
Definition util.cpp:1175
void addHtmlExtensionIfMissing(QCString &fName)
Definition util.cpp:4964
A bunch of utility functions.