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