Doxygen
Loading...
Searching...
No Matches
memberdef.cpp
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2015 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// own header
17#include "memberdef.h"
18
19// standard includes
20#include <memory>
21#include <mutex>
22#include <optional>
23
24// other includes
25#include "arguments.h"
26#include "code.h"
27#include "config.h"
28#include "defargs.h"
29#include "definitionimpl.h"
30#include "docparser.h"
31#include "dotcallgraph.h"
32#include "doxygen.h"
33#include "example.h"
34#include "filedef.h"
35#include "groupdef.h"
36#include "language.h"
37#include "md5hash.h"
38#include "membergroup.h"
39#include "memberlist.h"
40#include "membername.h"
41#include "message.h"
42#include "moduledef.h"
43#include "namespacedef.h"
44#include "outputlist.h"
45#include "parserintf.h"
46#include "regex.h"
47#include "trace.h"
48#include "util.h"
49#include "vhdldocgen.h"
50
51//-----------------------------------------------------------------------------
52
53class MemberDefImpl final : public DefinitionMixin<MemberDefMutable>
54{
55 public:
56 MemberDefImpl(const DString &defFileName,int defLine,size_t defColumn,
57 const DString &type,const DString &name,const DString &args,
58 const DString &excp,Protection prot,Specifier virt,bool stat,
59 Relationship related,MemberType t,const ArgumentList &tal,
60 const ArgumentList &al,const DString &metaData);
61 ~MemberDefImpl() override = default;
63
64 DefType definitionType() const override { return TypeMember; }
65 MemberDef *resolveAlias() override { return this; }
66 const MemberDef *resolveAlias() const override { return this; }
67 CodeSymbolType codeSymbolType() const override;
68 std::unique_ptr<MemberDef> deepCopy() const override;
69 void moveTo(Definition *) override;
70 DString getOutputFileBase() const override;
71 DString getReference() const override;
72 DString anchor() const override;
73 DString declaration() const override;
74 DString definition() const override;
75 DString typeString() const override;
76 DString argsString() const override;
77 DString excpString() const override;
78 DString bitfieldString() const override;
79 DString extraTypeChars() const override;
80 const DString &initializer() const override;
81 int initializerLines() const override;
82 TypeSpecifier getMemberSpecifiers() const override;
83 VhdlSpecifier getVhdlSpecifiers() const override;
84 const MemberList *getSectionList(const Definition *) const override;
85 DString displayDefinition() const override;
86 const ClassDef *getClassDef() const override;
87 ClassDef *getClassDef() override;
88 const FileDef *getFileDef() const override;
89 FileDef *getFileDef() override;
90 const NamespaceDef* getNamespaceDef() const override;
91 NamespaceDef* getNamespaceDef() override;
92 const GroupDef *getGroupDef() const override;
93 GroupDef *getGroupDef() override;
94 const ModuleDef *getModuleDef() const override;
95 DString getReadAccessor() const override;
96 DString getWriteAccessor() const override;
97 Grouping::GroupPri_t getGroupPri() const override;
98 DString getGroupFileName() const override;
99 int getGroupStartLine() const override;
100 bool getGroupHasDocs() const override;
101 DString qualifiedName() const override;
102 DString objCMethodName(bool localLink,bool showStatic) const override;
103 Protection protection() const override;
104 Specifier virtualness(int count=0) const override;
105 MemberType memberType() const override;
106 DString memberTypeName() const override;
107 bool isSignal() const override;
108 bool isSlot() const override;
109 bool isVariable() const override;
110 bool isEnumerate() const override;
111 bool isEnumValue() const override;
112 bool isTypedef() const override;
113 bool isSequence() const override;
114 bool isDictionary() const override;
115 bool isFunction() const override;
116 bool isFunctionPtr() const override;
117 bool isDefine() const override;
118 bool isFriend() const override;
119 bool isDCOP() const override;
120 bool isProperty() const override;
121 bool isEvent() const override;
122 bool isRelated() const override;
123 bool isForeign() const override;
124 bool isStatic() const override;
125 bool isInline() const override;
126 bool isExplicit() const override;
127 bool isMutable() const override;
128 bool isThreadLocal() const override;
129 bool isGettable() const override;
130 bool isPrivateGettable() const override;
131 bool isProtectedGettable() const override;
132 bool isSettable() const override;
133 bool isPrivateSettable() const override;
134 bool isProtectedSettable() const override;
135 bool isReadable() const override;
136 bool isWritable() const override;
137 bool isAddable() const override;
138 bool isRemovable() const override;
139 bool isRaisable() const override;
140 bool isFinal() const override;
141 bool isAbstract() const override;
142 bool isOverride() const override;
143 bool isInitonly() const override;
144 bool isOptional() const override;
145 bool isRequired() const override;
146 bool isNonAtomic() const override;
147 bool isCopy() const override;
148 bool isAssign() const override;
149 bool isRetain() const override;
150 bool isWeak() const override;
151 bool isStrong() const override;
152 bool isEnumStruct() const override;
153 bool isUnretained() const override;
154 bool isNew() const override;
155 bool isSealed() const override;
156 bool isImplementation() const override;
157 bool isExternal() const override;
158 bool isTypeAlias() const override;
159 bool isDefault() const override;
160 bool isDelete() const override;
161 bool isNoExcept() const override;
162 bool isAttribute() const override;
163 bool isUNOProperty() const override;
164 bool isReadonly() const override;
165 bool isBound() const override;
166 bool isConstrained() const override;
167 bool isTransient() const override;
168 bool isMaybeVoid() const override;
169 bool isMaybeDefault() const override;
170 bool isMaybeAmbiguous() const override;
171 bool isPublished() const override;
172 bool isTemplateSpecialization() const override;
173 bool isObjCMethod() const override;
174 bool isObjCProperty() const override;
175 bool isCSharpProperty() const override;
176 bool isConstructor() const override;
177 bool isDestructor() const override;
178 bool hasOneLineInitializer() const override;
179 bool hasMultiLineInitializer() const override;
180 bool isCallable() const override;
181 bool isStrongEnumValue() const override;
182 bool livesInsideEnum() const override;
183 bool isSliceLocal() const override;
184 bool isNoDiscard() const override;
185 bool isConstExpr() const override;
186 bool isConstEval() const override;
187 bool isConstInit() const override;
188 int numberOfFlowKeyWords() const override;
189 bool isFriendToHide() const override;
190 bool isNotFriend() const override;
191 bool isFunctionOrSignalSlot() const override;
192 bool isRelatedOrFriend() const override;
193 bool isLinkableInProject() const override;
194 bool isLinkable() const override;
195 bool hasDocumentation() const override;
196 bool hasUserDocumentation() const override;
197 bool isDeleted() const override;
198 bool isBriefSectionVisible() const override;
199 bool isDetailedSectionVisible(MemberListContainer container) const override;
200 bool hasDetailedDescription() const override;
201 bool isFriendClass() const override;
202 bool isDocumentedFriendClass() const override;
203 const MemberDef *reimplements() const override;
204 const MemberVector &reimplementedBy() const override;
205 bool isReimplementedBy(const ClassDef *cd) const override;
206 ClassDef *relatedAlso() const override;
207 bool hasDocumentedEnumValues() const override;
208 const MemberDef *getAnonymousEnumType() const override;
209 const MemberDef *anonymousMemberForDeclaration() const override;
210 const MemberDef *anonymousMemberForDetails() const override;
211 bool isDocsForDefinition() const override;
212 const MemberDef *getEnumScope() const override;
213 const MemberVector &enumFieldList() const override;
214 void setEnumBaseType(const DString &type) override;
215 DString enumBaseType() const override;
216 bool hasExamples() const override;
217 const ExampleList &getExamples() const override;
218 bool isPrototype() const override;
219 const ArgumentList &argumentList() const override;
220 const ArgumentList &declArgumentList() const override;
221 const ArgumentList &templateArguments() const override;
222 const ArgumentLists &definitionTemplateParameterLists() const override;
223 std::optional<ArgumentList> formalTemplateArguments() const override;
224 int getMemberGroupId() const override;
225 MemberGroup *getMemberGroup() const override;
226 bool hasCallGraph() const override;
227 bool hasCallerGraph() const override;
228 bool hasReferencesRelation() const override;
229 bool hasReferencedByRelation() const override;
230 bool hasEnumValues() const override;
231 bool hasInlineSource() const override;
232 bool isDocTransferDone() const override;
233 DString sourceRefName() const override;
234 const MemberDef *templateMaster() const override;
235 DString getScopeString() const override;
236 const ClassDef *getClassDefOfAnonymousType() const override;
237 bool isTypedefValCached() const override;
238 const ClassDef *getCachedTypedefVal() const override;
239 DString getCachedTypedefTemplSpec() const override;
240 DString getCachedResolvedTypedef() const override;
241 MemberDef *memberDefinition() const override;
242 MemberDef *memberDeclaration() const override;
243 const MemberDef *inheritsDocsFrom() const override;
244 const MemberDef *getGroupAlias() const override;
245 ClassDef *category() const override;
246 const MemberDef *categoryRelation() const override;
247 DString displayName(bool=true) const override;
248 DString getDeclType() const override;
249 StringVector getLabels(const Definition *container) const override;
250 const ArgumentList &typeConstraints() const override;
251 DString requiresClause() const override;
252 DString documentation() const override;
253 DString briefDescription(bool abbr=false) const override;
254 DString fieldType() const override;
255 bool isReference() const override;
256 DString getDeclFileName() const override;
257 int getDeclLine() const override;
258 size_t getDeclColumn() const override;
259 void setMemberType(MemberType t) override;
260 void setDefinition(const DString &d) override;
261 void setFileDef(FileDef *fd) override;
262 void setAnchor() override;
263 void setProtection(Protection p) override;
264 void setMemberSpecifiers(TypeSpecifier s) override;
265 void setVhdlSpecifiers(VhdlSpecifier s) override;
266 void mergeMemberSpecifiers(TypeSpecifier s) override;
267 void setInitializer(const DString &i) override;
268 void setBitfields(const DString &s) override;
269 void setMaxInitLines(int lines) override;
270 void setMemberClass(ClassDef *cd) override;
271 void setSectionList(const Definition *container,const MemberList *sl) override;
273 const DString &fileName,int startLine,bool hasDocs,
274 MemberDef *member=nullptr) override;
275 void setReadAccessor(const DString &r) override;
276 void setWriteAccessor(const DString &w) override;
277 void setTemplateSpecialization(bool b) override;
278 void makeRelated() override;
279 void makeForeign() override;
280 void setInheritsDocsFrom(const MemberDef *md) override;
281 void setTagInfo(const TagInfo *i) override;
282 void setArgsString(const DString &as) override;
283 void setReimplements(MemberDef *md) override;
284 void insertReimplementedBy(MemberDef *md) override;
285 void setRelatedAlso(ClassDef *cd) override;
286 void insertEnumField(MemberDef *md) override;
287 void setEnumScope(MemberDef *md,bool livesInsideEnum=false) override;
288 void setEnumClassScope(ClassDef *cd) override;
289 void setDocumentedEnumValues(bool value) override;
290 void setAnonymousEnumType(const MemberDef *md) override;
291 void setAnonymousMemberForDeclaration(const MemberDef *md) override;
292 void setAnonymousMemberForDetails(const MemberDef *md) override;
293 bool addExample(const DString &anchor,const DString &name,const DString &file) override;
294 void setPrototype(bool p,const DString &df,int line, size_t column) override;
295 void setExplicitExternal(bool b,const DString &df,int line,size_t column) override;
296 void setDeclFile(const DString &df,int line,size_t column) override;
297 void moveArgumentList(std::unique_ptr<ArgumentList> al) override;
298 void moveDeclArgumentList(std::unique_ptr<ArgumentList> al) override;
299 void setDefinitionTemplateParameterLists(const ArgumentLists &lists) override;
300 void setTypeConstraints(const ArgumentList &al) override;
301 void setType(const DString &t) override;
302 void setNamespace(NamespaceDef *nd) override;
303 void setMemberGroup(MemberGroup *grp) override;
304 void setMemberGroupId(int id) override;
305 void makeImplementationDetail() override;
306 void overrideCallGraph(bool e) override;
307 void overrideCallerGraph(bool e) override;
308 void overrideReferencedByRelation(bool e) override;
309 void overrideReferencesRelation(bool e) override;
310 void overrideEnumValues(bool e) override;
311 void overrideInlineSource(bool e) override;
312 void setTemplateMaster(const MemberDef *mt) override;
313 void setFormalTemplateArguments(const ArgumentList &al) override;
314 void addListReference(const Definition *) override;
315 void addRequirementReferences(const Definition *) override;
316 void setDocsForDefinition(bool b) override;
317 void setGroupAlias(const MemberDef *md) override;
318 void cacheTypedefVal(const ClassDef *val,const DString &templSpec,const DString &resolvedType) override;
319 void invalidateTypedefValCache() override;
320 void invalidateCachedArgumentTypes() override;
321 void setMemberDefinition(MemberDef *md) override;
322 void setMemberDeclaration(MemberDef *md) override;
323 void copyArgumentNames(const MemberDef *bmd) override;
324 void setCategory(ClassDef *) override;
325 void setCategoryRelation(const MemberDef *) override;
326 void setDocumentation(const DString &d,const DString &docFile,int docLine,bool stripWhiteSpace=true) override;
327 void setBriefDescription(const DString &b,const DString &briefFile,int briefLine) override;
328 void setInbodyDocumentation(const DString &d,const DString &inbodyFile,int inbodyLine) override;
329 void setHidden(bool b) override;
330 void setDocTransferDone() override;
331 void setExplicitInherited(bool b) override;
332 void setRequiresClause(const DString &req) override;
333 void incrementFlowKeyWordCount() override;
335 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
336 bool inGroup, int indentLevel,const ClassDef *inheritFrom=nullptr,const DString &inheritId=DString()) const override;
337 void writeDocumentation(const MemberList *ml,int memCount,int memTotal,OutputList &ol,
338 const DString &scopeName,const Definition *container,
339 bool inGroup,bool showEnumValues=false,bool
340 showInline=false) const override;
341 void writeMemberDocSimple(OutputList &ol,const Definition *container) const override;
342 void writeEnumDeclaration(OutputList &typeDecl,
343 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod) const override;
344 void writeTagFile(TextStream &,bool useQualifiedName,bool showNamespaceMembers) const override;
345 void warnIfUndocumented() const override;
346 void warnIfUndocumentedParams() const override;
347 bool visibleInIndex() const override;
348 void detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const override;
349 std::unique_ptr<MemberDef> createTemplateInstanceMember(const ArgumentList &formalArgs,
350 const std::unique_ptr<ArgumentList> &actualArgs) const override;
351 void findSectionsInDocumentation() override;
352 void writeLink(OutputList &ol,
353 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
354 bool onlyText=false) const override;
355 void resolveUnnamedParameters(const MemberDef *md) override;
356 void addQualifiers(const StringVector &qualifiers) override;
357 StringVector getQualifiers() const override;
359 void setModuleDef(ModuleDef *mod) override;
360 int redefineCount() const override;
361 void setRedefineCount(int) override;
362 void setClassDefOfAnonymousType(const ClassDef *cd) override;
363 void setIncludeFile(FileDef *fd,const DString &incName,bool local,bool force) override;
364
365 private:
369 void _writeGroupInclude(OutputList &ol,bool inGroup) const;
370 void _writeMultiLineInitializer(OutputList &ol,const DString &scopeName) const;
371 void _writeCallGraph(OutputList &ol) const;
372 void _writeCallerGraph(OutputList &ol) const;
373 void _writeReimplements(OutputList &ol) const;
374 bool _isReimplements() const;
375 void _writeReimplementedBy(OutputList &ol) const;
376 size_t _countReimplementedBy() const;
377 void _writeExamples(OutputList &ol) const;
378 void _writeTypeConstraints(OutputList &ol) const;
379 void _writeEnumValues(OutputList &ol,const Definition *container,
380 const DString &cfname,const DString &ciname,
381 const DString &cname) const;
382 void _writeCategoryRelation(OutputList &ol) const;
383 void _writeTagData(const DefType) const;
384 void _writeTemplatePrefix(OutputList &ol, const Definition *def,
385 const ArgumentList &al, bool writeReqClause=true) const;
386 bool _hasVisibleCallGraph() const;
387 bool _hasVisibleCallerGraph() const;
388 bool _isAnonymousBitField() const;
389
390
391 void init(Definition *def,const DString &t,const DString &a,const DString &e,
392 Protection p,Specifier v,bool s,Relationship r,
393 MemberType mt,const ArgumentList &tal,
394 const ArgumentList &al,const DString &meta
395 );
396
397 uint8_t m_isLinkableCached; // 0 = not cached, 1=false, 2=true
398 uint8_t m_isConstructorCached; // 0 = not cached, 1=false, 2=true
399 uint8_t m_isDestructorCached; // 1 = not cached, 1=false, 2=true
400
401 ClassDef *m_classDef = nullptr; // member of or related to
402 FileDef *m_fileDef = nullptr; // member of file definition
403 NamespaceDef *m_nspace = nullptr; // the namespace this member is in.
405
406 const MemberDef *m_enumScope = nullptr; // the enclosing scope, if this is an enum field
407 bool m_livesInsideEnum = false;
408 const MemberDef *m_annEnumType = nullptr; // the anonymous enum that is the type of this member
409 MemberVector m_enumFields; // enumeration fields
412
413 MemberDef *m_redefines = nullptr; // the members that this member redefines
414 MemberVector m_redefinedBy; // the list of members that redefine this one
415
416 MemberDef *m_memDef = nullptr; // member definition for this declaration
417 MemberDef *m_memDec = nullptr; // member declaration for this definition
418 ClassDef *m_relatedAlso = nullptr; // points to class marked by relatedAlso
419 //
420 std::unique_ptr<IncludeInfo> m_incInfo;
421
422 ExampleList m_examples; // a dictionary of all examples for quick access
423
424 DString m_type; // return actual type
425 DString m_args; // function arguments/variable array specifiers
426 DString m_def; // member definition in code (fully qualified name)
427 DString m_anc; // HTML anchor name
428 Specifier m_virt = Specifier::Normal; // normal/virtual/pure virtual
429 Protection m_prot = Protection::Public; // protection type [Public/Protected/Private]
430 DString m_decl; // member declaration in class
431
432 DString m_bitfields; // struct member bitfields
433 DString m_read; // property read accessor
434 DString m_write; // property write accessor
435 DString m_exception; // exceptions that can be thrown
436 DString m_initializer; // initializer
437 DString m_extraTypeChars; // extra type info found after the argument list
438 DString m_enumBaseType; // base type of the enum (C++11)
439 DString m_requiresClause; // requires clause (C++20)
440 int m_initLines = 0; // number of lines in the initializer
441 bool m_docTransferDone = false;
442
443 TypeSpecifier m_memSpec; // The specifiers present for this member
445 MemberType m_mtype = MemberType::Define; // returns the kind of member
446 int m_maxInitLines = 0; // when the initializer will be displayed
447 int m_userInitLines = 0; // result of explicit \hideinitializer or \showinitializer
448
449 ArgumentList m_defArgList; // argument list of this member definition
450 ArgumentList m_declArgList; // argument list of this member declaration
451
452 ArgumentList m_tArgList; // template argument list of function template
453 ArgumentList m_typeConstraints; // type constraints for template parameters
454 const MemberDef *m_templateMaster = nullptr;
455 std::optional<ArgumentList> m_formalTemplateArguments;
456 ArgumentLists m_defTmpArgLists; // lists of template argument lists
457 // (for template functions in nested template classes)
458
459 DString m_metaData; // Slice metadata.
460
461 const ClassDef *m_anonymousType = nullptr; // if the member has an anonymous compound
462 // as its type then this is computed by
463 // getClassDefOfAnonymousType() and
464 // cached here.
465 std::map<const Definition *,const MemberList *> m_sectionMap;
466
467 const MemberDef *m_groupAlias = nullptr; // Member containing the definition
468 int m_grpId = 0; // group id
469 MemberGroup *m_memberGroup = nullptr; // group's member definition
470 GroupDef *m_group = nullptr; // group in which this member is in
472 DString m_groupFileName; // file where this grouping was defined
473 int m_groupStartLine = 0; // line " " " " "
475
480
481 // documentation inheritance
482 const MemberDef *m_docProvider = nullptr;
483
484 // to store the output file base from tag files
487
488 // to store extra qualifiers
490
491 // objective-c
492 bool m_implOnly = false; // function found in implementation but not
493 // in the interface
494 mutable bool m_hasDocumentedParams = false; // guard to show only the first warning, acts as cache
495 mutable bool m_hasDocumentedReturnType = false; // guard to show only the first warning, acts as cache
496 bool m_isDMember = false;
497 Relationship m_related = Relationship::Member; // relationship of this to the class
498 bool m_stat = false; // is it a static function?
499 bool m_proto = false; // is it a prototype?
500 bool m_docEnumValues = false; // is an enum with documented enum values.
501
502 mutable bool m_hasDetailedDescriptionCached = false;
504 // const member.
505 bool m_hasCallGraph = false;
506 bool m_hasCallerGraph = false;
509 bool m_hasInlineSource = false;
510 bool m_hasEnumValues = false;
511 bool m_explExt = false; // member was explicitly declared external
512 bool m_tspec = false; // member is a template specialization
513 bool m_groupHasDocs = false; // true if the entry that caused the grouping was documented
514 bool m_docsForDefinition = false; // true => documentation block is put before
515 // definition.
516 // false => block is put before declaration.
520 int m_declLine = -1;
521 size_t m_declColumn = 1;
524};
525
526std::unique_ptr<MemberDef> createMemberDef(const DString &defFileName,int defLine,size_t defColumn,
527 const DString &type,const DString &name,const DString &args,
528 const DString &excp,Protection prot,Specifier virt,bool stat,
529 Relationship related,MemberType t,const ArgumentList &tal,
530 const ArgumentList &al,const DString &metaData)
531{
532 return std::make_unique<MemberDefImpl>(defFileName,defLine,defColumn,type,name,args,excp,prot,virt,
533 stat,related,t,tal,al,metaData);
534}
535
536//-----------------------------------------------------------------------------
537
538class MemberDefAliasImpl final : public DefinitionAliasMixin<MemberDef>
539{
540 public:
541 MemberDefAliasImpl(const Definition *newScope,const MemberDef *md)
542 : DefinitionAliasMixin(newScope,md), m_memberGroup(nullptr) { init(); }
543 ~MemberDefAliasImpl() override { deinit(); }
545
546 DefType definitionType() const override { return TypeMember; }
547
548 const MemberDef *getMdAlias() const { return toMemberDef(getAlias()); }
549 MemberDef *getMdAlias() { return toMemberDef(const_cast<Definition*>(getAlias())); }
550 MemberDef *resolveAlias() override { return const_cast<MemberDef*>(getMdAlias()); }
551 const MemberDef *resolveAlias() const override { return getMdAlias(); }
552
553 std::unique_ptr<MemberDef> deepCopy() const override {
555 }
556 void moveTo(Definition *) override {}
557
558 const DString &name() const override
559 { return getMdAlias()->name(); }
561 { return getMdAlias()->codeSymbolType(); }
562 DString getOutputFileBase() const override
563 { return getMdAlias()->getOutputFileBase(); }
564 DString getReference() const override
565 { return getMdAlias()->getReference(); }
566 DString anchor() const override
567 { return getMdAlias()->anchor(); }
568 DString declaration() const override
569 { return getMdAlias()->declaration(); }
570 DString definition() const override
571 { return getMdAlias()->definition(); }
572 DString typeString() const override
573 { return getMdAlias()->typeString(); }
574 DString argsString() const override
575 { return getMdAlias()->argsString(); }
576 DString excpString() const override
577 { return getMdAlias()->excpString(); }
578 DString bitfieldString() const override
579 { return getMdAlias()->bitfieldString(); }
580 DString extraTypeChars() const override
581 { return getMdAlias()->extraTypeChars(); }
582 const DString &initializer() const override
583 { return getMdAlias()->initializer(); }
584 int initializerLines() const override
585 { return getMdAlias()->initializerLines(); }
589 { return getMdAlias()->getVhdlSpecifiers(); }
590 const MemberList *getSectionList(const Definition *container) const override
591 { return getMdAlias()->getSectionList(container); }
592 DString displayDefinition() const override
593 { return getMdAlias()->displayDefinition(); }
594
595 const ClassDef *getClassDef() const override
596 { return getMdAlias()->getClassDef(); }
598 { return getMdAlias()->getClassDef(); }
599
600 const FileDef *getFileDef() const override
601 { return getMdAlias()->getFileDef(); }
602 FileDef *getFileDef() override
603 { return getMdAlias()->getFileDef(); }
604
605 const ModuleDef *getModuleDef() const override
606 { return getMdAlias()->getModuleDef(); }
607
608 const NamespaceDef* getNamespaceDef() const override
609 { return getMdAlias()->getNamespaceDef(); }
611 { return getMdAlias()->getNamespaceDef(); }
612
613 DString getReadAccessor() const override
614 { return getMdAlias()->getReadAccessor(); }
615 DString getWriteAccessor() const override
616 { return getMdAlias()->getWriteAccessor(); }
617 const GroupDef *getGroupDef() const override
618 { return getMdAlias()->getGroupDef(); }
620 { return getMdAlias()->getGroupDef(); }
622 { return getMdAlias()->getGroupPri(); }
623 DString getGroupFileName() const override
624 { return getMdAlias()->getGroupFileName(); }
625 int getGroupStartLine() const override
626 { return getMdAlias()->getGroupStartLine(); }
627 bool getGroupHasDocs() const override
628 { return getMdAlias()->getGroupHasDocs(); }
629 DString qualifiedName() const override
630 { return getMdAlias()->qualifiedName(); }
631 DString objCMethodName(bool localLink,bool showStatic) const override
632 { return getMdAlias()->objCMethodName(localLink,showStatic); }
633 Protection protection() const override
634 { return getMdAlias()->protection(); }
635 Specifier virtualness(int /* count */) const override
636 { return getMdAlias()->virtualness(); }
637 MemberType memberType() const override
638 { return getMdAlias()->memberType(); }
639 DString memberTypeName() const override
640 { return getMdAlias()->memberTypeName(); }
641 bool isSignal() const override
642 { return getMdAlias()->isSignal(); }
643 bool isSlot() const override
644 { return getMdAlias()->isSlot(); }
645 bool isVariable() const override
646 { return getMdAlias()->isVariable(); }
647 bool isEnumerate() const override
648 { return getMdAlias()->isEnumerate(); }
649 bool isEnumValue() const override
650 { return getMdAlias()->isEnumValue(); }
651 bool isTypedef() const override
652 { return getMdAlias()->isTypedef(); }
653 bool isSequence() const override
654 { return getMdAlias()->isSequence(); }
655 bool isDictionary() const override
656 { return getMdAlias()->isDictionary(); }
657 bool isFunction() const override
658 { return getMdAlias()->isFunction(); }
659 bool isFunctionPtr() const override
660 { return getMdAlias()->isFunctionPtr(); }
661 bool isDefine() const override
662 { return getMdAlias()->isDefine(); }
663 bool isFriend() const override
664 { return getMdAlias()->isFriend(); }
665 bool isDCOP() const override
666 { return getMdAlias()->isDCOP(); }
667 bool isProperty() const override
668 { return getMdAlias()->isProperty(); }
669 bool isEvent() const override
670 { return getMdAlias()->isEvent(); }
671 bool isRelated() const override
672 { return getMdAlias()->isRelated(); }
673 bool isForeign() const override
674 { return getMdAlias()->isForeign(); }
675 bool isStatic() const override
676 { return getMdAlias()->isStatic(); }
677 bool isInline() const override
678 { return getMdAlias()->isInline(); }
679 bool isExplicit() const override
680 { return getMdAlias()->isExplicit(); }
681 bool isMutable() const override
682 { return getMdAlias()->isMutable(); }
683 bool isThreadLocal() const override
684 { return getMdAlias()->isThreadLocal(); }
685 bool isGettable() const override
686 { return getMdAlias()->isGettable(); }
687 bool isPrivateGettable() const override
688 { return getMdAlias()->isPrivateGettable(); }
689 bool isProtectedGettable() const override
690 { return getMdAlias()->isProtectedGettable(); }
691 bool isSettable() const override
692 { return getMdAlias()->isSettable(); }
693 bool isPrivateSettable() const override
694 { return getMdAlias()->isPrivateSettable(); }
695 bool isProtectedSettable() const override
696 { return getMdAlias()->isProtectedSettable(); }
697 bool isReadable() const override
698 { return getMdAlias()->isReadable(); }
699 bool isWritable() const override
700 { return getMdAlias()->isWritable(); }
701 bool isAddable() const override
702 { return getMdAlias()->isAddable(); }
703 bool isRemovable() const override
704 { return getMdAlias()->isRemovable(); }
705 bool isRaisable() const override
706 { return getMdAlias()->isRaisable(); }
707 bool isFinal() const override
708 { return getMdAlias()->isFinal(); }
709 bool isAbstract() const override
710 { return getMdAlias()->isAbstract(); }
711 bool isOverride() const override
712 { return getMdAlias()->isOverride(); }
713 bool isInitonly() const override
714 { return getMdAlias()->isInitonly(); }
715 bool isOptional() const override
716 { return getMdAlias()->isOptional(); }
717 bool isRequired() const override
718 { return getMdAlias()->isRequired(); }
719 bool isNonAtomic() const override
720 { return getMdAlias()->isNonAtomic(); }
721 bool isCopy() const override
722 { return getMdAlias()->isCopy(); }
723 bool isAssign() const override
724 { return getMdAlias()->isAssign(); }
725 bool isRetain() const override
726 { return getMdAlias()->isRetain(); }
727 bool isWeak() const override
728 { return getMdAlias()->isWeak(); }
729 bool isStrong() const override
730 { return getMdAlias()->isStrong(); }
731 bool isEnumStruct() const override
732 { return getMdAlias()->isEnumStruct(); }
733 bool isUnretained() const override
734 { return getMdAlias()->isUnretained(); }
735 bool isNew() const override
736 { return getMdAlias()->isNew(); }
737 bool isSealed() const override
738 { return getMdAlias()->isSealed(); }
739 bool isImplementation() const override
740 { return getMdAlias()->isImplementation(); }
741 bool isExternal() const override
742 { return getMdAlias()->isExternal(); }
743 bool isTypeAlias() const override
744 { return getMdAlias()->isTypeAlias(); }
745 bool isDefault() const override
746 { return getMdAlias()->isDefault(); }
747 bool isDelete() const override
748 { return getMdAlias()->isDelete(); }
749 bool isNoExcept() const override
750 { return getMdAlias()->isNoExcept(); }
751 bool isAttribute() const override
752 { return getMdAlias()->isAttribute(); }
753 bool isUNOProperty() const override
754 { return getMdAlias()->isUNOProperty(); }
755 bool isReadonly() const override
756 { return getMdAlias()->isReadable(); }
757 bool isBound() const override
758 { return getMdAlias()->isBound(); }
759 bool isConstrained() const override
760 { return getMdAlias()->isConstrained(); }
761 bool isTransient() const override
762 { return getMdAlias()->isTransient(); }
763 bool isMaybeVoid() const override
764 { return getMdAlias()->isMaybeVoid(); }
765 bool isMaybeDefault() const override
766 { return getMdAlias()->isMaybeDefault(); }
767 bool isMaybeAmbiguous() const override
768 { return getMdAlias()->isMaybeAmbiguous(); }
769 bool isPublished() const override
770 { return getMdAlias()->isPublished(); }
771 bool isTemplateSpecialization() const override
772 { return getMdAlias()->isTemplateSpecialization(); }
773 bool isObjCMethod() const override
774 { return getMdAlias()->isObjCMethod(); }
775 bool isObjCProperty() const override
776 { return getMdAlias()->isObjCProperty(); }
777 bool isCSharpProperty() const override
778 { return getMdAlias()->isCSharpProperty(); }
779 bool isConstructor() const override
780 { return getMdAlias()->isConstructor(); }
781 bool isDestructor() const override
782 { return getMdAlias()->isDestructor(); }
783 bool hasOneLineInitializer() const override
784 { return getMdAlias()->hasOneLineInitializer(); }
785 bool hasMultiLineInitializer() const override
786 { return getMdAlias()->hasMultiLineInitializer(); }
787 bool isCallable() const override
788 { return getMdAlias()->isCallable(); }
789 bool isStrongEnumValue() const override
790 { return getMdAlias()->isStrongEnumValue(); }
791 bool livesInsideEnum() const override
792 { return getMdAlias()->livesInsideEnum(); }
793 bool isSliceLocal() const override
794 { return getMdAlias()->isSliceLocal(); }
795 bool isNoDiscard() const override
796 { return getMdAlias()->isNoDiscard(); }
797 bool isConstExpr() const override
798 { return getMdAlias()->isConstExpr(); }
799 bool isConstEval() const override
800 { return getMdAlias()->isConstEval(); }
801 bool isConstInit() const override
802 { return getMdAlias()->isConstInit(); }
803 int numberOfFlowKeyWords() const override
804 { return getMdAlias()->numberOfFlowKeyWords(); }
805 bool isFriendToHide() const override
806 { return getMdAlias()->isFriendToHide(); }
807 bool isNotFriend() const override
808 { return getMdAlias()->isNotFriend(); }
809 bool isFunctionOrSignalSlot() const override
810 { return getMdAlias()->isFunctionOrSignalSlot(); }
811 bool isRelatedOrFriend() const override
812 { return getMdAlias()->isRelatedOrFriend(); }
813 bool isLinkableInProject() const override
814 { return getMdAlias()->isLinkableInProject(); }
815 bool isLinkable() const override
816 { return getMdAlias()->isLinkable(); }
817 bool hasDocumentation() const override
818 { return getMdAlias()->hasDocumentation(); }
819 bool hasUserDocumentation() const override
820 { return getMdAlias()->hasUserDocumentation(); }
821 bool isDeleted() const override
822 { return getMdAlias()->isDeleted(); }
823 bool isBriefSectionVisible() const override
824 { return getMdAlias()->isBriefSectionVisible(); }
825 bool isDetailedSectionVisible(MemberListContainer container) const override
826 { return getMdAlias()->isDetailedSectionVisible(container); }
827 bool hasDetailedDescription() const override
828 { return getMdAlias()->hasDetailedDescription(); }
829 bool isFriendClass() const override
830 { return getMdAlias()->isFriendClass(); }
831 bool isDocumentedFriendClass() const override
832 { return getMdAlias()->isDocumentedFriendClass(); }
833 const MemberDef *reimplements() const override
834 { return getMdAlias()->reimplements(); }
835 const MemberVector &reimplementedBy() const override
836 { return getMdAlias()->reimplementedBy(); }
837 bool isReimplementedBy(const ClassDef *cd) const override
838 { return getMdAlias()->isReimplementedBy(cd); }
839 ClassDef *relatedAlso() const override
840 { return getMdAlias()->relatedAlso(); }
841 bool hasDocumentedEnumValues() const override
842 { return getMdAlias()->hasDocumentedEnumValues(); }
843 const MemberDef *getAnonymousEnumType() const override
844 { return getMdAlias()->getAnonymousEnumType(); }
847 const MemberDef *anonymousMemberForDetails() const override
849 bool isDocsForDefinition() const override
850 { return getMdAlias()->isDocsForDefinition(); }
851 const MemberDef *getEnumScope() const override
852 { return getMdAlias()->getEnumScope(); }
853 const MemberVector &enumFieldList() const override
854 { return getMdAlias()->enumFieldList(); }
855 DString enumBaseType() const override
856 { return getMdAlias()->enumBaseType(); }
857 bool hasExamples() const override
858 { return getMdAlias()->hasExamples(); }
859 const ExampleList &getExamples() const override
860 { return getMdAlias()->getExamples(); }
861 bool isPrototype() const override
862 { return getMdAlias()->isPrototype(); }
863 const ArgumentList &argumentList() const override
864 { return getMdAlias()->argumentList(); }
865 const ArgumentList &declArgumentList() const override
866 { return getMdAlias()->declArgumentList(); }
867 const ArgumentList &templateArguments() const override
868 { return getMdAlias()->templateArguments(); }
871 std::optional<ArgumentList> formalTemplateArguments() const override
872 { return getMdAlias()->formalTemplateArguments(); }
873 int getMemberGroupId() const override
874 { return getMdAlias()->getMemberGroupId(); }
875 MemberGroup *getMemberGroup() const override
876 { return m_memberGroup; }
877 bool hasCallGraph() const override
878 { return getMdAlias()->hasCallGraph(); }
879 bool hasCallerGraph() const override
880 { return getMdAlias()->hasCallerGraph(); }
881 bool hasReferencesRelation() const override
882 { return getMdAlias()->hasReferencesRelation(); }
883 bool hasReferencedByRelation() const override
884 { return getMdAlias()->hasReferencedByRelation(); }
885 bool hasInlineSource() const override
886 { return getMdAlias()->hasInlineSource(); }
887 bool isDocTransferDone() const override
888 { return getMdAlias()->isDocTransferDone(); }
889 DString sourceRefName() const override
890 { return getMdAlias()->sourceRefName(); }
891 bool hasEnumValues() const override
892 { return getMdAlias()->hasEnumValues(); }
894 { return getMdAlias()->getQualifiers(); }
895 const MemberDef *templateMaster() const override
896 { return getMdAlias()->templateMaster(); }
897 DString getScopeString() const override
898 { return getMdAlias()->getScopeString(); }
899 const ClassDef *getClassDefOfAnonymousType() const override
901 bool isTypedefValCached() const override
902 { return getMdAlias()->isTypedefValCached(); }
903 const ClassDef *getCachedTypedefVal() const override
904 { return getMdAlias()->getCachedTypedefVal(); }
909 MemberDef *memberDefinition() const override
910 { return getMdAlias()->memberDefinition(); }
911 MemberDef *memberDeclaration() const override
912 { return getMdAlias()->memberDeclaration(); }
913 const MemberDef *inheritsDocsFrom() const override
914 { return getMdAlias()->inheritsDocsFrom(); }
915 const MemberDef *getGroupAlias() const override
916 { return getMdAlias()->getGroupAlias(); }
917 ClassDef *category() const override
918 { return getMdAlias()->category(); }
919 const MemberDef *categoryRelation() const override
920 { return getMdAlias()->categoryRelation(); }
921 DString displayName(bool b=true) const override
922 { return getMdAlias()->displayName(b); }
923 DString getDeclType() const override
924 { return getMdAlias()->getDeclType(); }
925 StringVector getLabels(const Definition *container) const override
926 { return getMdAlias()->getLabels(container); }
927 const ArgumentList &typeConstraints() const override
928 { return getMdAlias()->typeConstraints(); }
929 DString documentation() const override
930 { return getMdAlias()->documentation(); }
931 DString briefDescription(bool /* abbr=false */) const override
932 { return getMdAlias()->briefDescription(); }
933 DString fieldType() const override
934 { return getMdAlias()->fieldType(); }
935 bool isReference() const override
936 { return getMdAlias()->isReference(); }
937 DString getDeclFileName() const override
938 { return getMdAlias()->getDeclFileName(); }
939 int getDeclLine() const override
940 { return getMdAlias()->getDeclLine(); }
941 size_t getDeclColumn() const override
942 { return getMdAlias()->getDeclColumn(); }
943 DString requiresClause() const override
944 { return getMdAlias()->requiresClause(); }
945 bool visibleInIndex() const override
946 { return getMdAlias()->visibleInIndex(); }
947 int redefineCount() const override
948 { return getMdAlias()->redefineCount(); }
949
950 void warnIfUndocumented() const override {}
951 void warnIfUndocumentedParams() const override {}
952 void detectUndocumentedParams(bool /* hasParamCommand */,bool /* hasReturnCommand */) const override {}
953 void setMemberGroup(MemberGroup *grp) override { m_memberGroup = grp; }
954 std::unique_ptr<MemberDef> createTemplateInstanceMember(const ArgumentList &formalArgs,
955 const std::unique_ptr<ArgumentList> &actualArgs) const override
956 { return getMdAlias()->createTemplateInstanceMember(formalArgs,actualArgs); }
957
959 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
960 bool inGroup, int indentLevel, const ClassDef *inheritFrom=nullptr,const DString &inheritId=DString()) const override
961 {
962 getMdAlias()->writeDeclaration(ol,cd,nd,fd,gd,mod,inGroup,indentLevel,inheritFrom,inheritId);
963 }
965 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod) const override
966 {
967 getMdAlias()->writeEnumDeclaration(typeDecl,cd,nd,fd,gd,mod);
968 }
970 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
971 bool onlyText=false) const override
972 {
973 getMdAlias()->writeLink(ol,cd,nd,fd,gd,mod,onlyText);
974 }
975 private:
976 MemberGroup *m_memberGroup; // group's member definition
977};
978
979
980std::unique_ptr<MemberDef> createMemberDefAlias(const Definition *newScope,const MemberDef *aliasMd)
981{
982 auto amd = std::make_unique<MemberDefAliasImpl>(newScope,aliasMd);
983 //printf("amd: name=%s displayName=%s\n",qPrint(amd->name()),qPrint(amd->displayName()));
984 return amd;
985}
986
987//-----------------------------------------------------------------------------
988
989static void writePageRef(OutputList &ol,const DString &cn,const DString &mn)
990{
992
996 if (Config_getBool(PDF_HYPERLINKS)) ol.disable(OutputType::Latex);
997 if (Config_getBool(RTF_HYPERLINKS)) ol.disable(OutputType::RTF);
998 ol.startPageRef();
1000 ol.endPageRef(cn,mn);
1001
1002 ol.popGeneratorState();
1003}
1004
1005
1006//-----------------------------------------------------------------------------
1007
1008static DString addTemplateNames(const DString &s,const DString &n,const DString &t)
1009{
1010 DString result;
1011 DString clRealName=n;
1012 size_t p=0,i=0;
1013 if ((i=clRealName.find('<'))!=DString::npos)
1014 {
1015 clRealName=clRealName.left(i); // strip template specialization
1016 }
1017 if ((i=clRealName.rfind("::"))!=DString::npos)
1018 {
1019 clRealName=clRealName.mid(i+2);
1020 }
1021 while ((i=s.find(clRealName,p))!=DString::npos)
1022 {
1023 result+=s.mid(p,i-p);
1024 size_t j=clRealName.length()+i;
1025 if (s.length()==j || (s.at(j)!='<' && !isId(s.at(j))))
1026 { // add template names
1027 //printf("Adding %s+%s\n",qPrint(clRealName),qPrint(t));
1028 result+=clRealName+t;
1029 }
1030 else
1031 { // template names already present
1032 //printf("Adding %s\n",qPrint(clRealName));
1033 result+=clRealName;
1034 }
1035 p=i+clRealName.length();
1036 }
1037 result+=s.mid(p);
1038 //printf("addTemplateNames(%s,%s,%s)=%s\n",qPrint(s),qPrint(n),qPrint(t),qPrint(result));
1039 return result;
1040}
1041
1042// ol.startMemberDocName has already been done before this is called.
1043// when this function returns true, ol.endParameterList will be called.
1044//
1045// typical sequence:
1046// ol.startMemberDoc
1047// ol.startMemberDocName
1048// --- enter writeDefArgumentList
1049// ol.endMemberDocName
1050// ol.startParameterList
1051// ...
1052// ol.startParameterType(first=true)
1053// ol.endParameterType
1054// ol.startParameterName
1055// ol.endParameterName
1056// ol.startParameterExtra
1057// ol.startParameterDefVal [optional]
1058// ol.endParameterDefVal [optional]
1059// ol.endParameterExtra(last==false)
1060// ...
1061// ol.startParameterType(first=false)
1062// ol.endParameterType
1063// ol.startParameterName
1064// ol.endParameterName
1065// ol.startParameterExtra
1066// ol.endParameterExtra(last==true)
1067// ...
1068// --- leave writeDefArgumentList with return value true
1069// ol.endParameterList
1070// ol.endMemberDoc(hasArgs=true)
1071//
1072// For an empty list the function should return false, the sequence is
1073// ol.startMemberDoc
1074// ol.startMemberDocName
1075// --- enter writeDefArgumentList
1076// --- leave writeDefArgumentList with return value false
1077// ol.endMemberDocName
1078// ol.endMemberDoc(hasArgs=false);
1079//
1080
1081static bool writeDefArgumentList(OutputList &ol,const Definition *scope,const MemberDef *md)
1082{
1083 const ArgumentList &defArgList=(md->isDocsForDefinition()) ?
1084 md->argumentList() : md->declArgumentList();
1085 //printf("writeDefArgumentList '%s' isDocsForDefinition()=%d hasParameters()=%d (%s)\n",
1086 // qPrint(md->name()),md->isDocsForDefinition(),defArgList.hasParameters(),qPrint(argListToString(defArgList)));
1087 if (!defArgList.hasParameters() || md->isProperty() || md->isTypedef())
1088 {
1089 return false; // member has no function like argument list
1090 }
1091
1092 bool isDefine = md->isDefine();
1093 if (!isDefine) ol.docify(" ");
1094
1095 //printf("writeDefArgList(%d)\n",defArgList->count());
1096 ol.endMemberDocName();
1098 //printf("===> name=%s isDefine=%d\n",qPrint(md->name()),md->isDefine());
1099
1100 DString cName;
1101 if (scope)
1102 {
1103 cName=scope->name();
1104 size_t il=cName.find('<');
1105 size_t ir=cName.rfind('>');
1106 if (il!=DString::npos && ir!=DString::npos && ir>il)
1107 {
1108 cName=cName.mid(il,ir-il+1);
1109 //printf("1. cName=%s\n",qPrint(cName));
1110 }
1111 else if (scope->definitionType()==Definition::TypeClass)
1112 {
1113 cName=tempArgListToString((toClassDef(scope))->templateArguments(),
1114 scope->getLanguage());
1115 //printf("2. cName=%s\n",qPrint(cName));
1116 }
1117 else // no template specifier
1118 {
1119 cName.clear();
1120 }
1121 }
1122 //printf("~~~ %s cName=%s\n",qPrint(md->name()),qPrint(cName));
1123
1125
1126 LinkifyTextOptions options;
1127 options.setScope(scope).setFileScope(md->getBodyDef()).setSelf(md);
1128
1129 bool first=true;
1130 bool paramTypeStarted=false;
1131 auto alIt = defArgList.begin();
1132 while (alIt!=defArgList.end())
1133 {
1134 Argument a = *alIt;
1135 if (isDefine || first)
1136 {
1137 ol.startParameterType(first,DString());
1138 paramTypeStarted=true;
1139 if (isDefine)
1140 {
1141 ol.endParameterType();
1142 ol.startParameterName(true);
1143 }
1144 }
1145
1146 if (!a.attrib.empty() && !md->isObjCMethod()) // argument has an IDL attribute
1147 {
1148 ol.docify(a.attrib+" ");
1149 }
1150
1151 DString atype = a.type;
1152 if (sep!="::") { atype=substitute(atype,"::",sep); }
1153
1154 size_t funcPtrPos=DString::npos;
1155 {
1156 if (md->isObjCMethod()) { atype.prepend("("); atype.append(")"); }
1157 if (atype!="...")
1158 {
1159 if (!cName.empty() && scope && scope!=Doxygen::globalScope)
1160 {
1161 atype=addTemplateNames(atype,scope->name(),cName);
1162 }
1163 // 1. split ...*)(... -> '*' + name + ')(...'
1164 // 2. split ...*[some thing])(... -> '*' + name + '[some thing])(...'
1165 size_t starPos = atype.find('*'); // find pointer
1166 if (starPos==DString::npos) starPos = atype.find('&'); // can also be reference
1167 funcPtrPos = atype.find(")(");
1168 if (starPos!=DString::npos && funcPtrPos!=DString::npos && funcPtrPos>starPos)
1169 {
1170 funcPtrPos=starPos+1;
1171 }
1172 else
1173 {
1174 funcPtrPos=DString::npos;
1175 }
1177 funcPtrPos==DString::npos ? atype : atype.left(funcPtrPos),
1178 options);
1179 }
1180 }
1181
1182 if (!isDefine)
1183 {
1184 if (paramTypeStarted)
1185 {
1186 ol.endParameterType();
1187 paramTypeStarted=false;
1188 }
1189 ol.startParameterName(defArgList.size()<2);
1190 }
1191 else
1192 {
1193 ol.endParameterName();
1194 }
1195
1196 if (atype=="...")
1197 {
1198 ol.docify(atype);
1199 }
1200 else if (!a.name.empty()) // argument has a name
1201 {
1202 ol.docify(a.name);
1203 }
1204 if (!isDefine)
1205 {
1206 if (funcPtrPos!=DString::npos)
1207 {
1209 }
1210 ol.endParameterName();
1211 }
1213 if (funcPtrPos!=DString::npos)
1214 {
1215 linkifyText(TextGeneratorOLImpl(ol),atype.mid(funcPtrPos),options);
1216 }
1217 if (!a.array.empty())
1218 {
1219 ol.docify(a.array);
1220 }
1221 if (!a.defval.empty()) // write the default value
1222 {
1223 DString n=a.defval;
1224 if (scope && scope!=Doxygen::globalScope && !cName.empty())
1225 {
1226 n=addTemplateNames(n,scope->name(),cName);
1227 }
1228 ol.startParameterDefVal(" = ");
1229 linkifyText(TextGeneratorOLImpl(ol),n,LinkifyTextOptions(options).setKeepSpaces(true));
1230 ol.endParameterDefVal();
1231 }
1232 ++alIt;
1233 if (alIt!=defArgList.end())
1234 {
1235 a = *alIt;
1236 if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
1237 if (!isDefine)
1238 {
1239 DString key;
1240 if (md->isObjCMethod() && a.attrib.length()>=2)
1241 {
1242 //printf("Found parameter keyword %s\n",a.qPrint(attrib));
1243 // strip [ and ]
1244 key=a.attrib.mid(1,a.attrib.length()-2);
1245 if (key!=",") key+=":"; // for normal keywords add colon
1246 }
1247 ol.endParameterExtra(false,false,!md->isObjCMethod());
1248 ol.startParameterType(false,key);
1249 paramTypeStarted=true;
1250 }
1251 else // isDefine
1252 {
1253 ol.endParameterExtra(false,false,true);
1254 }
1255 }
1256 first=false;
1257 }
1258 if (first)
1259 {
1260 ol.startParameterName(defArgList.size()<2);
1261 ol.endParameterName();
1263 }
1264 ol.endParameterExtra(true,defArgList.size()<2,!md->isObjCMethod());
1265 if (!md->extraTypeChars().empty())
1266 {
1267 ol.docify(md->extraTypeChars());
1268 }
1269 if (defArgList.constSpecifier())
1270 {
1271 ol.docify(" const");
1272 }
1273 if (defArgList.volatileSpecifier())
1274 {
1275 ol.docify(" volatile");
1276 }
1277 if (defArgList.refQualifier()==RefQualifierType::LValue)
1278 {
1279 ol.docify(" &");
1280 }
1281 else if (defArgList.refQualifier()==RefQualifierType::RValue)
1282 {
1283 ol.docify(" &&");
1284 }
1285 if (!defArgList.trailingReturnType().empty())
1286 {
1287 linkifyText(TextGeneratorOLImpl(ol), defArgList.trailingReturnType(), options);
1288 }
1289 return true;
1290}
1291
1293 OutputList &ol, const ClassDef *cd, const MemberDef *md, DString const& exception)
1294{
1295 // this is ordinary exception spec - there must be a '('
1296 //printf("exception='%s'\n",qPrint(exception));
1297 size_t index = exception.find('(');
1298 LinkifyTextOptions options;
1299 options.setScope(cd).setFileScope(md->getBodyDef()).setSelf(md);
1300 if (index!=DString::npos)
1301 {
1302 ol.exceptionEntry(exception.left(index),false);
1303 ++index; // paren in second column so skip it here
1304 for (size_t comma = exception.find(',', index); comma!=DString::npos; )
1305 {
1306 ++comma; // include comma
1307 linkifyText(TextGeneratorOLImpl(ol),exception.mid(index,comma-index),options);
1308 ol.exceptionEntry(DString(),false);
1309 index=comma;
1310 comma = exception.find(',', index);
1311 }
1312 if (size_t close = exception.find(')', index); close!=DString::npos)
1313 {
1314 DString type=removeRedundantWhiteSpace(exception.mid(index,close-index));
1315 linkifyText(TextGeneratorOLImpl(ol),type,options);
1316 ol.exceptionEntry(DString(),true);
1317 }
1318 else
1319 {
1320 warn(md->getDefFileName(),md->getDefLine(),
1321 "missing ) in exception list on member {}",md->name());
1322 }
1323 }
1324 else // Java Exception
1325 {
1326 ol.docify(" ");
1327 linkifyText(TextGeneratorOLImpl(ol),exception,options);
1328 }
1329}
1330
1331static void writeExceptionList(OutputList &ol, const ClassDef *cd, const MemberDef *md)
1332{
1333 DString exception = md->excpString().stripWhiteSpace();
1334 if (exception.at(0)=='{')
1335 {
1336 // this is an UNO IDL attribute - need special handling
1337 size_t index = exception.find(';');
1338 size_t oldIndex = 1;
1339 while (index!=DString::npos) // there should be no more than 2 (set / get)
1340 {
1341 // omit '{' and ';' -> "set raises (...)"
1342 writeExceptionListImpl(ol,cd,md,exception.mid(oldIndex,index-oldIndex));
1343 oldIndex = index+1;
1344 index = exception.find(';',oldIndex);
1345 }
1346 // the rest is now just '}' - omit that
1347 }
1348 else
1349 {
1350 writeExceptionListImpl(ol,cd,md,exception);
1351 }
1352}
1353
1354//-----------------------------------------------------------------------------
1355//-----------------------------------------------------------------------------
1356//-----------------------------------------------------------------------------
1357
1359 const DString &t,const DString &a,const DString &e,
1360 Protection p,Specifier v,bool s,Relationship r,
1361 MemberType mt,const ArgumentList &tal,
1362 const ArgumentList &al,const DString &meta
1363 )
1364{
1365 m_classDef=nullptr;
1366 m_fileDef=nullptr;
1367 m_moduleDef=nullptr;
1368 m_redefines=nullptr;
1369 m_relatedAlso=nullptr;
1370 m_nspace=nullptr;
1371 m_memDef=nullptr;
1372 m_memDec=nullptr;
1373 m_group=nullptr;
1374 m_grpId=-1;
1375 m_enumScope=nullptr;
1376 m_livesInsideEnum=false;
1377 m_hasCallGraph = Config_getBool(CALL_GRAPH);
1378 m_hasCallerGraph = Config_getBool(CALLER_GRAPH);
1379 m_hasReferencedByRelation = Config_getBool(REFERENCED_BY_RELATION);
1380 m_hasReferencesRelation = Config_getBool(REFERENCES_RELATION);
1381 m_hasEnumValues = Config_getBool(SHOW_ENUM_VALUES);
1382 m_hasInlineSource = Config_getBool(INLINE_SOURCES);
1383 m_initLines=0;
1384 m_type=t;
1385 if (mt==MemberType::Typedef) m_type.stripPrefix("typedef ");
1386 // type.stripPrefix("struct ");
1387 // type.stripPrefix("class " );
1388 // type.stripPrefix("union " );
1390 m_args=a;
1392 if (m_type.empty()) m_decl=d->name()+m_args; else m_decl=m_type+" "+d->name()+m_args;
1393
1394 m_memberGroup=nullptr;
1395 m_virt=v;
1396 m_prot=p;
1397 m_related=r;
1398 m_stat=s;
1399 m_mtype=mt;
1400 m_exception=e;
1401 m_proto=false;
1404 m_annEnumType=nullptr;
1405 m_annMemberForDecl=nullptr;
1406 m_annMemberForDetails=nullptr;
1407 m_groupAlias=nullptr;
1408 m_explExt=false;
1409 m_tspec=false;
1410 m_anonymousType=nullptr;
1411 m_maxInitLines=Config_getInt(MAX_INITIALIZER_LINES);
1412 m_userInitLines=-1;
1413 m_docEnumValues=false;
1414 // copy function template arguments (if any)
1415 m_tArgList = tal;
1416 //printf("new member al=%p\n",al);
1417 // copy function definition arguments (if any)
1418 m_defArgList = al;
1419 // convert function declaration arguments (if any)
1420 if (!m_args.empty())
1421 {
1423 //printf("setDeclArgList %s to %s const=%d\n",qPrint(args),
1424 // qPrint(argListToString(declArgList)),declArgList->constSpecifier);
1425 }
1426 m_metaData = meta;
1427 m_templateMaster = nullptr;
1428 m_docsForDefinition = true;
1429 m_isTypedefValCached = false;
1430 m_cachedTypedefValue = nullptr;
1431 m_implOnly=false;
1432 m_groupMember = nullptr;
1433 m_hasDocumentedParams = false;
1435 m_docProvider = nullptr;
1437}
1438
1439
1440//-----------------------------------------------------------------------------
1441//-----------------------------------------------------------------------------
1442//-----------------------------------------------------------------------------
1443
1444/*! Creates a new member definition.
1445 *
1446 * \param df File containing the definition of this member.
1447 * \param dl Line at which the member definition was found.
1448 * \param dc Column at which the member definition was found.
1449 * \param t A string representing the type of the member.
1450 * \param na A string representing the name of the member.
1451 * \param a A string representing the arguments of the member.
1452 * \param e A string representing the throw clause of the members.
1453 * \param p The protection context of the member, possible values are:
1454 * \c Public, \c Protected, \c Private.
1455 * \param v The degree of 'virtualness' of the member, possible values are:
1456 * \c Normal, \c Virtual, \c Pure.
1457 * \param s A boolean that is true iff the member is static.
1458 * \param r The relationship between the class and the member.
1459 * \param mt The kind of member. See #MemberType for a list of
1460 * all types.
1461 * \param tal The template arguments of this member.
1462 * \param al The arguments of this member. This is a structured form of
1463 * the string past as argument \a a.
1464 * \param meta Slice metadata.
1465 */
1466
1467MemberDefImpl::MemberDefImpl(const DString &df,int dl,size_t dc,
1468 const DString &t,const DString &na,const DString &a,const DString &e,
1470 const ArgumentList &tal,const ArgumentList &al,const DString &meta
1472{
1473 //printf("MemberDefImpl::MemberDef(%s)\n",qPrint(na));
1474 init(this,t,a,e,p,v,s,r,mt,tal,al,meta);
1478}
1479
1480std::unique_ptr<MemberDef> MemberDefImpl::deepCopy() const
1481{
1482 std::unique_ptr<MemberDefImpl> result(new MemberDefImpl(
1485 // first copy base members
1486 result->DefinitionMixin<MemberDefMutable>::operator=(*this);
1487 // then copy other members
1488 result->m_typeConstraints = m_typeConstraints ;
1489 result->m_declArgList = m_declArgList ;
1490 result->m_classDef = m_classDef ;
1491 result->m_fileDef = m_fileDef ;
1492 result->m_moduleDef = m_moduleDef ;
1493 result->m_nspace = m_nspace ;
1494 result->m_enumScope = m_enumScope ;
1495 result->m_livesInsideEnum = m_livesInsideEnum ;
1496 result->m_annEnumType = m_annEnumType ;
1497 result->m_annMemberForDecl = m_annMemberForDecl ;
1498 result->m_annMemberForDetails = m_annMemberForDetails ;
1499 result->m_enumFields = m_enumFields ;
1500 result->m_redefines = m_redefines ;
1501 result->m_redefinedBy = m_redefinedBy ;
1502 result->m_memDef = m_memDef ;
1503 result->m_memDec = m_memDec ;
1504 result->m_relatedAlso = m_relatedAlso ;
1505 result->m_examples = m_examples ;
1506 result->m_def = m_def ;
1507 result->m_anc = m_anc ;
1508 result->m_decl = m_decl ;
1509 result->m_bitfields = m_bitfields ;
1510 result->m_read = m_read ;
1511 result->m_write = m_write ;
1512 result->m_exception = m_exception ;
1513 result->m_initializer = m_initializer ;
1514 result->m_extraTypeChars = m_extraTypeChars ;
1515 result->m_enumBaseType = m_enumBaseType ;
1516 result->m_requiresClause = m_requiresClause ;
1517 result->m_initLines = m_initLines ;
1518 result->m_memSpec = m_memSpec ;
1519 result->m_vhdlSpec = m_vhdlSpec ;
1520 result->m_maxInitLines = m_maxInitLines ;
1521 result->m_userInitLines = m_userInitLines ;
1522 result->m_defArgList = m_defArgList ;
1523 result->m_declArgList = m_declArgList ;
1524 result->m_tArgList = m_tArgList ;
1525 result->m_typeConstraints = m_typeConstraints ;
1526 result->m_templateMaster = m_templateMaster ;
1527 result->m_formalTemplateArguments = m_formalTemplateArguments ;
1528 result->m_defTmpArgLists = m_defTmpArgLists ;
1529 result->m_anonymousType = m_anonymousType ;
1530 result->m_sectionMap = m_sectionMap ;
1531 result->m_groupAlias = m_groupAlias ;
1532 result->m_grpId = m_grpId ;
1533 result->m_memberGroup = m_memberGroup ;
1534 result->m_group = m_group ;
1535 result->m_grouppri = m_grouppri ;
1536 result->m_groupFileName = m_groupFileName ;
1537 result->m_groupStartLine = m_groupStartLine ;
1538 result->m_groupMember = m_groupMember ;
1539 result->m_isTypedefValCached = m_isTypedefValCached ;
1540 result->m_cachedTypedefValue = m_cachedTypedefValue ;
1541 result->m_cachedTypedefTemplSpec = m_cachedTypedefTemplSpec ;
1542 result->m_cachedResolvedType = m_cachedResolvedType ;
1543 result->m_docProvider = m_docProvider ;
1544 result->m_explicitOutputFileBase = m_explicitOutputFileBase ;
1545 result->m_qualifiers = m_qualifiers ;
1546 result->m_implOnly = m_implOnly ;
1547 result->m_hasDocumentedParams = m_hasDocumentedParams ;
1548 result->m_hasDocumentedReturnType = m_hasDocumentedReturnType ;
1549 result->m_isDMember = m_isDMember ;
1550 result->m_proto = m_proto ;
1551 result->m_docEnumValues = m_docEnumValues ;
1552 result->m_hasDetailedDescriptionCached = m_hasDetailedDescriptionCached ;
1553 result->m_detailedDescriptionCachedValue = m_detailedDescriptionCachedValue ;
1554 result->m_hasCallGraph = m_hasCallGraph ;
1555 result->m_hasCallerGraph = m_hasCallerGraph ;
1556 result->m_hasReferencedByRelation = m_hasReferencedByRelation ;
1557 result->m_hasReferencesRelation = m_hasReferencesRelation ;
1558 result->m_hasEnumValues = m_hasEnumValues ;
1559 result->m_hasInlineSource = m_hasInlineSource ;
1560 result->m_explExt = m_explExt ;
1561 result->m_tspec = m_tspec ;
1562 result->m_groupHasDocs = m_groupHasDocs ;
1563 result->m_docsForDefinition = m_docsForDefinition ;
1564 result->m_category = m_category ;
1565 result->m_categoryRelation = m_categoryRelation ;
1566 result->m_declFileName = m_declFileName ;
1567 result->m_declLine = m_declLine ;
1568 result->m_declColumn = m_declColumn ;
1569 result->m_numberOfFlowKW = m_numberOfFlowKW ;
1570 result->setDefinitionTemplateParameterLists(m_defTmpArgLists);
1571 if (m_incInfo)
1572 {
1573 result->m_incInfo = std::make_unique<IncludeInfo>();
1574 *(result->m_incInfo) = *m_incInfo;
1575 }
1576
1577 result->m_isLinkableCached = 0;
1578 result->m_isConstructorCached = 0;
1579 result->m_isDestructorCached = 0;
1580 return result;
1581}
1582
1584{
1585 setOuterScope(scope);
1587 {
1588 m_classDef = toClassDef(scope);
1589 }
1590 else if (scope->definitionType()==Definition::TypeFile)
1591 {
1592 m_fileDef = toFileDef(scope);
1593 }
1594 else if (scope->definitionType()==Definition::TypeModule)
1595 {
1596 m_moduleDef = toModuleDef(scope);
1597 }
1598 else if (scope->definitionType()==Definition::TypeNamespace)
1599 {
1600 m_nspace = toNamespaceDef(scope);
1601 }
1604}
1605
1606
1611
1613{
1614 if (m_templateMaster)
1615 {
1617 if (mdm)
1618 {
1619 mdm->insertReimplementedBy(md);
1620 }
1621 }
1622 if (!m_redefinedBy.contains(md))
1623 {
1625 }
1626}
1627
1629{
1630 return m_redefines;
1631}
1632
1634{
1635 return m_redefinedBy;
1636}
1637
1639{
1640 if (cd)
1641 {
1642 for (const auto &md : m_redefinedBy)
1643 {
1644 const ClassDef *mcd = md->getClassDef();
1645 if (mcd)
1646 {
1647 if (cd==mcd || cd->isBaseClass(mcd,true))
1648 {
1649 return true;
1650 }
1651 }
1652 }
1653 }
1654 return false;
1655}
1656
1661
1662bool MemberDefImpl::addExample(const DString &anchor,const DString &nameStr, const DString &file)
1663{
1664 //printf("%s::addExample(%s,%s,%s)\n",qPrint(name()),anchor,nameStr,file);
1665 return m_examples.inSort(Example(anchor,nameStr,file));
1666}
1667
1669{
1670 return !m_examples.empty();
1671}
1672
1674{
1675 DString n = name();
1676 DString s = getScopeString();
1677
1678 if (!s.empty())
1679 {
1680 n.prepend(s+"::");
1681 }
1682 else if (isStatic() && getFileDef())
1683 {
1684 n.prepend(getFileDef()->name()+":");
1685 }
1686 if (isCallable())
1687 {
1688 n.append(argsString());
1689 }
1690 return n;
1691}
1692
1694{
1695 bool separateMemberPages = Config_getBool(SEPARATE_MEMBER_PAGES);
1696 bool inlineSimpleClasses = Config_getBool(INLINE_SIMPLE_STRUCTS);
1697 DString baseName;
1698
1699 //printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n",
1700 // qPrint(name()),m_templateMaster,m_group,m_classDef,
1701 // m_nspace,m_fileDef);
1702 const NamespaceDef *nspace = getNamespaceDef();
1703 const FileDef *fileDef = getFileDef();
1704 const ClassDef *classDef = getClassDef();
1705 const ModuleDef *moduleDef = getModuleDef();
1706 const GroupDef *groupDef = getGroupDef();
1708 {
1710 }
1711 else if (templateMaster() && (classDef==nullptr || classDef->isImplicitTemplateInstance()))
1712 {
1714 }
1715 else if (anonymousMemberForDetails())
1716 {
1718 }
1719 else if (groupDef)
1720 {
1721 baseName=groupDef->getOutputFileBase();
1722 }
1723 else if (classDef)
1724 {
1725 baseName=classDef->getOutputFileBase();
1726 if (inlineSimpleClasses && classDef->isSimple())
1727 {
1728 return baseName;
1729 }
1730 }
1731 else if (nspace && (nspace->isLinkable() || nspace->isAnonymous()))
1732 {
1733 baseName=nspace->getOutputFileBase();
1734 }
1735 else if (fileDef)
1736 {
1737 baseName=fileDef->getOutputFileBase();
1738 }
1739 else if (moduleDef)
1740 {
1741 baseName=moduleDef->getOutputFileBase();
1742 }
1743
1744 if (baseName.empty())
1745 {
1747 "Internal inconsistency: member {} does not belong to any container!",name()
1748 );
1749 return "dummy";
1750 }
1751 else if (separateMemberPages && hasDetailedDescription())
1752 {
1753 if (getEnumScope()) // enum value, which is part of enum's documentation
1754 {
1755 baseName+="_"+getEnumScope()->anchor();
1756 }
1757 else
1758 {
1759 baseName+="_"+anchor();
1760 }
1761 }
1762 return baseName;
1763}
1764
1766{
1768 if (!ref.empty())
1769 {
1770 return ref;
1771 }
1772 const NamespaceDef *nspace = getNamespaceDef();
1773 const FileDef *fileDef = getFileDef();
1774 const ClassDef *classDef = getClassDef();
1775 const ModuleDef *moduleDef = getModuleDef();
1776 const GroupDef *groupDef = getGroupDef();
1777 if (templateMaster())
1778 {
1779 return templateMaster()->getReference();
1780 }
1781 else if (groupDef)
1782 {
1783 return groupDef->getReference();
1784 }
1785 else if (classDef)
1786 {
1787 return classDef->getReference();
1788 }
1789 else if (nspace)
1790 {
1791 return nspace->getReference();
1792 }
1793 else if (moduleDef)
1794 {
1795 return moduleDef->getReference();
1796 }
1797 else if (fileDef)
1798 {
1799 return fileDef->getReference();
1800 }
1801 return "";
1802}
1803
1805{
1806 DString result=m_anc;
1807 if (m_groupAlias) return m_groupAlias->anchor();
1810 if (m_enumScope && m_enumScope!=this) // avoid recursion for C#'s public enum E { E, F }
1811 {
1812 result.prepend(m_enumScope->anchor());
1813 }
1814 if (getGroupDef())
1815 {
1816 if (m_groupMember)
1817 {
1818 result=m_groupMember->anchor();
1819 }
1820 else if (getReference().empty())
1821 {
1822 result.prepend("g");
1823 }
1824 }
1825 return result;
1826}
1827
1829{
1830 AUTO_TRACE("name={}",qualifiedName());
1831 bool extractStatic = Config_getBool(EXTRACT_STATIC);
1832 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
1833 m_isLinkableCached = 2; // linkable
1834 //printf("MemberDefImpl::isLinkableInProject(name=%s)\n",qPrint(name()));
1835 if (isHidden())
1836 {
1837 AUTO_TRACE_ADD("is hidden");
1839 return;
1840 }
1841 if (templateMaster())
1842 {
1843 AUTO_TRACE_ADD("has master template");
1845 return;
1846 }
1847 if (isAnonymous())
1848 {
1849 AUTO_TRACE_ADD("name invalid");
1850 m_isLinkableCached = 1; // not a valid or a dummy name
1851 return;
1852 }
1853 if (!hasDocumentation() || isReference())
1854 {
1855 AUTO_TRACE_ADD("no docs or reference");
1856 m_isLinkableCached = 1; // no documentation
1857 return;
1858 }
1859 const GroupDef *groupDef = getGroupDef();
1860 const ClassDef *classDef = getClassDef();
1861 if (groupDef && !groupDef->isLinkableInProject())
1862 {
1863 AUTO_TRACE_ADD("in not linkable group");
1864 m_isLinkableCached = 1; // group but group not linkable
1865 return;
1866 }
1867 if (!groupDef && classDef && !classDef->isLinkableInProject())
1868 {
1869 AUTO_TRACE_ADD("in not linkable class");
1870 m_isLinkableCached = 1; // in class but class not linkable
1871 return;
1872 }
1873 const NamespaceDef *nspace = getNamespaceDef();
1874 const FileDef *fileDef = getFileDef();
1875 if (!groupDef && nspace /*&& m_related==Relationship::Member*/ && !nspace->isLinkableInProject()
1876 && (fileDef==nullptr || !fileDef->isLinkableInProject()))
1877 {
1878 AUTO_TRACE_ADD("in not linkable namespace");
1879 m_isLinkableCached = 1; // in namespace but namespace not linkable
1880 return;
1881 }
1882 if (!groupDef && !nspace &&
1883 /*m_related==Relationship::Member &&*/ !classDef &&
1884 fileDef && !fileDef->isLinkableInProject())
1885 {
1886 AUTO_TRACE_ADD("in not linkable file");
1887 m_isLinkableCached = 1; // in file (and not in namespace) but file not linkable
1888 return;
1889 }
1890 if ((!protectionLevelVisible(m_prot) && m_mtype!=MemberType::Friend) &&
1891 !(m_prot==Protection::Private && (m_virt!=Specifier::Normal || isOverride() || isFinal()) && extractPrivateVirtual))
1892 {
1893 AUTO_TRACE_ADD("private and invisible");
1894 m_isLinkableCached = 1; // hidden due to protection
1895 return;
1896 }
1897 if (m_stat && classDef==nullptr && !extractStatic)
1898 {
1899 AUTO_TRACE_ADD("static and invisible");
1900 m_isLinkableCached = 1; // hidden due to staticness
1901 return;
1902 }
1903 AUTO_TRACE_ADD("linkable");
1904 return; // linkable!
1905}
1906
1912
1918
1923
1928
1934
1940
1942{
1943 if (m_isLinkableCached==0)
1944 {
1945 MemberDefImpl *that = const_cast<MemberDefImpl*>(this);
1947 }
1949 return m_isLinkableCached==2;
1950}
1951
1953{
1954 if (m_templateMaster)
1955 {
1956 return m_templateMaster->isLinkable();
1957 }
1958 else
1959 {
1960 return isLinkableInProject() || isReference();
1961 }
1962}
1963
1964
1969
1971 const ClassDef *,const NamespaceDef *,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
1972 bool onlyText) const
1973{
1974 SrcLangExt lang = getLanguage();
1975 bool hideScopeNames = Config_getBool(HIDE_SCOPE_NAMES);
1976 DString sep = getLanguageSpecificSeparator(lang,true);
1977 DString n = name();
1978 const ClassDef *classDef = getClassDef();
1979 const NamespaceDef *nspace = getNamespaceDef();
1980 if (!hideScopeNames)
1981 {
1982 if (m_enumScope && m_livesInsideEnum && getGroupDef()!=nullptr)
1983 {
1985 }
1986 if (classDef && (gd || mod) && !isRelated())
1987 {
1988 n.prepend(classDef->displayName()+sep);
1989 }
1990 else if (nspace && (gd || fd || mod))
1991 {
1992 n.prepend(nspace->displayName()+sep);
1993 }
1994 }
1995
1996 if (isObjCMethod())
1997 {
1998 if (isStatic()) ol.docify("+ "); else ol.docify("- ");
1999 }
2000 if (!onlyText && (isLinkable() || hasDetailedDescription())) // write link
2001 {
2002 if (m_mtype==MemberType::EnumValue && getGroupDef()==nullptr && // enum value is not grouped
2003 getEnumScope() && getEnumScope()->getGroupDef()) // but its container is
2004 {
2005 const GroupDef *enumValGroup = getEnumScope()->getGroupDef();
2006 ol.writeObjectLink(enumValGroup->getReference(),
2007 enumValGroup->getOutputFileBase(),
2008 anchor(),n);
2009 }
2010 else
2011 {
2013 }
2014 }
2015 else // write only text
2016 {
2017 ol.startBold();
2018 ol.docify(n);
2019 ol.endBold();
2020 }
2021}
2022
2027
2028/*! If this member has an anonymous class/struct/union as its type, then
2029 * this method will return the ClassDef that describes this return type.
2030 */
2035
2036/*! This methods returns true iff the brief section (also known as
2037 * declaration section) is visible in the documentation.
2038 */
2040{
2041 bool extractStatic = Config_getBool(EXTRACT_STATIC);
2042 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
2043 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
2044 bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
2045 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
2046 bool hideFriendCompounds = Config_getBool(HIDE_FRIEND_COMPOUNDS);
2047
2048 //printf("Member %s grpId=%d docs=%s file=%s args=%s\n",
2049 // qPrint(name()),
2050 // 0,"", //grpId,grpId==-1?"<none>":Doxygen::memberDocDict[grpId]->data(),
2051 // "", //qPrint(getFileDef()->name()),
2052 // argsString());
2053
2054 bool hasDocs = hasDocumentation();
2055
2056 // only include static members with file/namespace scope if
2057 // explicitly enabled in the config file
2058 bool visibleIfStatic = !(getClassDef()==nullptr &&
2059 isStatic() &&
2060 !extractStatic
2061 );
2062
2063 // only include members is the are documented or
2064 // HIDE_UNDOC_MEMBERS is NO in the config file
2065 bool visibleIfDocumented = (!hideUndocMembers ||
2066 hasDocs ||
2068 );
2069
2070 // hide members with no detailed description and brief descriptions
2071 // explicitly disabled.
2072 bool visibleIfEnabled = !(hideUndocMembers &&
2073 documentation().empty() &&
2074 !briefMemberDesc &&
2075 !repeatBrief
2076 );
2077
2078 // Hide friend (class|struct|union) declarations if HIDE_FRIEND_COMPOUNDS is true
2079 bool visibleIfFriendCompound = !(hideFriendCompounds &&
2080 isFriend()
2081 );
2082
2083 // only include members that are non-private unless EXTRACT_PRIVATE is
2084 // set to YES or the member is part of a group. And as a special case,
2085 // private *documented* virtual members are shown if EXTRACT_PRIV_VIRTUAL
2086 // is set to YES
2087 bool visibleIfPrivate = (protectionLevelVisible(protection()) ||
2088 m_mtype==MemberType::Friend ||
2089 (m_prot==Protection::Private &&
2090 (m_virt!=Specifier::Normal || isOverride() || isFinal()) && extractPrivateVirtual && hasDocs)
2091 );
2092
2093 // hide member if it overrides a member in a superclass and has no
2094 // documentation of its own
2095 //bool visibleIfDocVirtual = !reimplements() ||
2096 // !Config_getBool(INHERIT_DOCS) ||
2097 // hasDocs;
2098
2099 // true if this member is a constructor or destructor
2100 bool cOrDTor = isConstructor() || isDestructor();
2101
2102 // hide default constructors or destructors (no args) without
2103 // documentation
2104 bool visibleIfNotDefaultCDTor = !(cOrDTor &&
2105 (m_defArgList.empty() ||
2106 m_defArgList.front().type == "void"
2107 ) &&
2108 !hasDocs
2109 );
2110
2111
2112 //printf("visibleIfStatic=%d visibleIfDocumented=%d visibleIfEnabled=%d "
2113 // "visibleIfPrivate=%d visibleIfNotDefaultCDTor=%d "
2114 // "visibleIfFriendCompound=%d\n",
2115 // visibleIfStatic,visibleIfDocumented,
2116 // visibleIfEnabled,visibleIfPrivate,visibleIfNotDefaultCDTor,
2117 // visibleIfFriendCompound);
2118
2119 bool visible = visibleIfStatic && visibleIfDocumented &&
2120 visibleIfEnabled && visibleIfPrivate &&
2121 /*visibleIfDocVirtual &&*/ visibleIfNotDefaultCDTor &&
2122 visibleIfFriendCompound &&
2123 !isHidden();
2124 //printf("MemberDefImpl::isBriefSectionVisible() %d\n",visible);
2125 return visible;
2126}
2127
2129{
2130 SrcLangExt lang = getLanguage();
2131 DString ltype(m_type);
2132 if (lang==SrcLangExt::Cpp && isEnumerate() && isStrong())
2133 {
2134 if (isEnumStruct())
2135 {
2136 ltype+=" struct";
2137 }
2138 else
2139 {
2140 ltype+=" class";
2141 }
2142 }
2143 if (isTypedef() && getLanguage() != SrcLangExt::Slice)
2144 {
2145 ltype.prepend("typedef ");
2146 }
2147 if (isTypeAlias())
2148 {
2149 if (lang==SrcLangExt::Python)
2150 {
2151 ltype="type";
2152 }
2153 else
2154 {
2155 ltype="using";
2156 }
2157 }
2158 // strip 'friend' keyword from ltype
2159 ltype.stripPrefix("friend ");
2160 if (ltype=="@") // rename type from enum values
2161 {
2162 ltype="";
2163 }
2164 else
2165 {
2166 if (isObjCMethod())
2167 {
2168 ltype.prepend("(");
2169 ltype.append(")");
2170 }
2171 }
2172 return ltype;
2173}
2174
2176 const ArgumentList &al, bool writeReqClause) const
2177{
2178 ol.docify("template<");
2179 LinkifyTextOptions options;
2180 options.setScope(def).setFileScope(getFileDef()).setSelf(this);
2181 for (auto it = al.begin(); it!=al.end();)
2182 {
2183 Argument a = *it;
2184 linkifyText(TextGeneratorOLImpl(ol),a.type,options);
2185 if (!a.name.empty())
2186 {
2187 ol.docify(" ");
2188 ol.docify(a.name);
2189 }
2190 if (!a.defval.empty())
2191 {
2192 ol.docify(" = ");
2193 ol.docify(a.defval);
2194 }
2195 ++it;
2196 if (it!=al.end()) ol.docify(", ");
2197 }
2198 ol.docify("> ");
2199 if (writeReqClause && !m_requiresClause.empty())
2200 {
2201 ol.lineBreak();
2202 ol.docify("requires ");
2204 m_requiresClause, // text
2205 LinkifyTextOptions(options).setAutoBreak(true).setBreakThreshold(120));
2206 }
2207}
2208
2210{
2211 if (exception.empty()) return args; // no exception, nothing to combine args
2212 size_t pos = args.rfind(')');
2213 size_t eqPos = pos!=DString::npos ? args.find('=',pos) : DString::npos; // look for '=' in '(args) = something'
2214 if (eqPos==DString::npos) return args+" "+exception; // append exception at the end
2215 return args.left(eqPos)+" "+exception+" "+args.mid(eqPos); // insert exception before =
2216}
2217
2219{
2220 return !m_bitfields.empty() && name().startsWith("__pad"); // anonymous bitfield
2221}
2222
2224 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod,
2225 bool inGroup, int indentLevel, const ClassDef *inheritedFrom,const DString &inheritId) const
2226{
2227 //printf("> %s MemberDefImpl::writeDeclaration() inGroup=%d inheritId=%s\n",qPrint(qualifiedName()),inGroup,qPrint(inheritId));
2228
2229 // hide enum value, since they appear already as part of the enum, unless they
2230 // are explicitly grouped.
2231 if (!inGroup && m_mtype==MemberType::EnumValue) return;
2232
2233 const Definition *d=nullptr;
2234 ASSERT (cd!=nullptr || nd!=nullptr || fd!=nullptr || gd!=nullptr || mod!=nullptr); // member should belong to something
2235 if (cd) d=cd;
2236 else if (nd) d=nd;
2237 else if (fd) d=fd;
2238 else d=gd;
2239 if (d==gd || d==mod) // see bug 753608
2240 {
2241 if (getClassDef()) d = getClassDef();
2242 else if (getNamespaceDef()) d = getNamespaceDef();
2243 else if (getFileDef()) d = getFileDef();
2244 }
2245 else if (d==fd) // see issue #9850, namespace member can be shown in file scope as well
2246 {
2247 if (getNamespaceDef()) d = getNamespaceDef();
2248 }
2249 if (d==nullptr)
2250 {
2251 err("No context could be derived for member '{}'\n",name());
2252 return; // should not happen
2253 }
2254
2255 DString cname = d->name();
2256 DString cdname = d->displayName();
2257 DString cfname = getOutputFileBase();
2258
2259 // search for the last anonymous scope in the member type
2260 const ClassDef *annoClassDef=getClassDefOfAnonymousType();
2261
2263
2264 // start a new member declaration
2267 ol.startMemberItem(annoClassDef && isAnonymous() ? DString() : anchor(), anonType, inheritId);
2268
2269
2270 // If there is no detailed description we need to write the anchor here.
2271 bool detailsVisible = hasDetailedDescription();
2272 bool writeAnchor = (inGroup || getGroupDef()==nullptr) && // only write anchors for member that have no details and are
2273 !detailsVisible && // rendered inside the group page or are not grouped at all
2274 inheritId.empty();
2275
2276 if (writeAnchor)
2277 {
2278 DString doxyArgs=argsString();
2279 DString doxyName=name();
2280 if (!cname.empty())
2281 {
2283 }
2284 ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs);
2285 ol.addLabel(cfname,anchor());
2286 }
2287
2288 if (!detailsVisible)
2289 {
2290 ol.pushGeneratorState();
2294 ol.docify("\n");
2295 ol.popGeneratorState();
2296 }
2297
2298 if (annoClassDef)
2299 {
2300 for (int j=0;j<indentLevel;j++)
2301 {
2303 }
2304 }
2305
2306 // *** write template lists
2307 if (m_tArgList.hasParameters() && getLanguage()==SrcLangExt::Cpp)
2308 {
2311 ol.endMemberTemplateParams(anchor(),inheritId);
2312 }
2313
2314
2315 // *** write type
2316 DString ltype(m_type);
2317 auto lang = getLanguage();
2318 if (isTypedef() && lang != SrcLangExt::Slice)
2319 {
2320 ltype.prepend("typedef ");
2321 }
2322 if (isTypeAlias())
2323 {
2324 if (lang==SrcLangExt::Python)
2325 {
2326 ltype="type";
2327 }
2328 else
2329 {
2330 ltype="using";
2331 }
2332 }
2333 // strip 'friend' keyword from ltype
2334 ltype.stripPrefix("friend ");
2335 static const reg::Ex r(R"(@\d+)"); // anonymous type marker
2336 reg::Match match;
2337 std::string stype = ltype.str();
2338 bool endAnonScopeNeeded=false;
2339 LinkifyTextOptions options;
2340 options.setScope(d).setFileScope(getBodyDef()).setSelf(this);
2341 if (reg::search(stype,match,r)) // member has an anonymous type marker
2342 {
2343 //printf("name=%s annoClassDef=%p stype='%s' scopeName='%s'\n",
2344 // qPrint(name()),(void*)annoClassDef,qPrint(stype),qPrint(cname));
2345
2346 static const reg::Ex ar(R"([\w@:]*@\d+[\w@:]*)"); // anonymous type marker(s) including scope
2347 reg::Match amatch;
2348 reg::search(stype,amatch,ar);
2349 size_t ai = amatch.position();
2350 size_t al = amatch.length();
2351 const MemberDef *amd = getAnonymousEnumType();
2352 if (annoClassDef && amd==nullptr) // type is an anonymous compound
2353 {
2354 if (isAnonymous()) // anonymous type without a variable name, e.g. "struct { int x; };" or "union { int x; };"
2355 {
2356 ol.startAnonTypeScope(indentLevel);
2357 annoClassDef->writeDeclaration(ol,inGroup,indentLevel+1,inheritedFrom,inheritId);
2358 //printf(">>>>>>>>>>>>>> startMemberItem(2)\n");
2360 ol.startMemberItem(anchor(),anonType,inheritId);
2361 for (int j=0;j< indentLevel;j++)
2362 {
2364 }
2365 ol.docify("};");
2366 endAnonScopeNeeded=true;
2367 }
2368 else
2369 {
2370 ol.writeObjectLink(annoClassDef->getReference(),annoClassDef->getOutputFileBase(),
2371 annoClassDef->anchor(),ltype.left(ai)+ltype.mid(ai+al));
2372 }
2373 }
2374 else if (amd) // type is an anonymous enum
2375 {
2376 DString typePlaceholder = " { ... } ";
2377 if (lang==SrcLangExt::Cpp)
2378 {
2379 if (amd->isEnumStruct()) typePlaceholder.prepend(" struct");
2380 else if (amd->isStrong()) typePlaceholder.prepend(" class");
2381 }
2383 amd->anchor(),ltype.left(ai)+typePlaceholder+ltype.mid(ai+al));
2384 }
2385 else // fallback if anonymous type is not found
2386 {
2387 size_t i = match.position();
2388 size_t l = match.length();
2389 ltype = ltype.left(i) + " { ... } " + removeAnonymousScopes(ltype.mid(i+l));
2390 linkifyText(TextGeneratorOLImpl(ol), ltype, options);
2391 }
2392 }
2393 else if (ltype=="@") // rename type from enum values
2394 {
2395 ltype="";
2396 }
2397 else
2398 {
2399 if (isObjCMethod())
2400 {
2401 ltype.prepend("(");
2402 ltype.append(")");
2403 }
2404 linkifyText(TextGeneratorOLImpl(ol),ltype,options);
2405 }
2406
2407 if (!ltype.empty())
2408 {
2409 ol.pushGeneratorState();
2411 ol.docify(" ");
2412 ol.popGeneratorState();
2413 }
2414
2415 if (!isAnonymous())
2416 {
2418 }
2419
2420 // *** write name
2421 if (!isAnonymous() && !_isAnonymousBitField()) // hide anonymous stuff
2422 {
2423 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
2424 bool extractStatic = Config_getBool(EXTRACT_STATIC);
2425 bool visibleIfPrivate = (protectionLevelVisible(protection()) ||
2426 m_mtype==MemberType::Friend ||
2427 (m_prot==Protection::Private &&
2428 (m_virt!=Specifier::Normal || isOverride() || isFinal()) &&
2429 extractPrivateVirtual && hasDocumentation()
2430 ));
2431 //printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d hasDocumentation=%d\n",qPrint(name()),gd,getGroupDef(),inGroup,isLinkable(),hasDocumentation());
2432 if (!name().empty() && // name valid
2433 (hasDetailedDescription() || isReference()) && // has docs
2434 visibleIfPrivate &&
2435 !(isStatic() && getClassDef()==nullptr && !extractStatic) // hidden due to static-ness
2436 )
2437 {
2438 //printf("writeLink %s->%d\n",qPrint(name),hasDocumentation());
2439 const ClassDef *rcd = cd;
2440 if (isReference() && getClassDef()) rcd = getClassDef();
2441 writeLink(ol,rcd,nd,fd,gd,mod);
2442 }
2443 else if (isDocumentedFriendClass())
2444 // if the member is an undocumented friend declaration for some class,
2445 // then maybe we can link to the class
2446 {
2447 writeLink(ol,getClass(name()),nullptr,nullptr,nullptr,nullptr);
2448 }
2449 else
2450 // there is a brief member description and brief member
2451 // descriptions are enabled or there is no detailed description.
2452 {
2453 const ClassDef *rcd = cd;
2454 if (isReference() && getClassDef()) rcd = getClassDef();
2455 writeLink(ol,rcd,nd,fd,gd,mod,true);
2456 }
2457 }
2458
2459 // *** write arguments
2460 if (!argsString().empty() && !isObjCMethod())
2461 {
2462 if (!isDefine() && !isTypedef()) ol.writeString(" ");
2464 isDefine() ?
2465 substitute(argsString(),",",", ") :
2466 isTypedef() ?
2467 substitute(argsString(),")(",") (") :
2469 LinkifyTextOptions(options)
2470 .setArgumentList(&m_defArgList)
2471 .setAutoBreak(false)
2472 .setIndentLevel(indentLevel)
2473 );
2474 }
2475
2476 // *** write bitfields
2477 if (!m_bitfields.empty()) // add bitfields
2478 {
2480 }
2481 else if (hasOneLineInitializer()
2482 //!init.empty() && initLines==0 && // one line initializer
2483 //((maxInitLines>0 && userInitLines==-1) || userInitLines>0) // enabled by default or explicitly
2484 ) // add initializer
2485 {
2486 if (isTypeAlias()) // using statement
2487 {
2488 ol.writeString(" = ");
2490 }
2491 else if (!isDefine())
2492 {
2493 //ol.writeString(" = ");
2494 ol.writeString(" ");
2496 }
2497 else
2498 {
2501 }
2502 }
2503
2504
2506 {
2507 ol.startTypewriter();
2508 ol.docify(" [implementation]");
2509 ol.endTypewriter();
2510 }
2511
2512 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
2513
2514 if (isProperty() && (isSettable() || isGettable() ||
2517 {
2518 ol.writeLatexSpacing();
2519 ol.startTypewriter();
2520 ol.docify(" [");
2521 StringVector sl;
2522
2523 if (isGettable()) sl.emplace_back("get");
2524 if (isProtectedGettable()) sl.emplace_back("protected get");
2525 if (isSettable()) sl.emplace_back("set");
2526 if (isProtectedSettable()) sl.emplace_back("protected set");
2527 if (extractPrivate)
2528 {
2529 if (isPrivateGettable()) sl.emplace_back("private get");
2530 if (isPrivateSettable()) sl.emplace_back("private set");
2531 }
2532 bool first=true;
2533 for (const auto &s : sl)
2534 {
2535 if (!first)
2536 {
2537 ol.docify(", ");
2538 }
2539 first=false;
2540 ol.docify(s);
2541 }
2542 ol.docify("]");
2543 ol.endTypewriter();
2544 }
2545
2546 if (isEvent() && (isAddable() || isRemovable() || isRaisable()))
2547 {
2548 ol.writeLatexSpacing();
2549 ol.startTypewriter();
2550 ol.docify(" [");
2551 StringVector sl;
2552 if (isAddable()) sl.emplace_back("add");
2553 if (isRemovable()) sl.emplace_back("remove");
2554 if (isRaisable()) sl.emplace_back("raise");
2555 bool first=true;
2556 for (const auto &s : sl)
2557 {
2558 if (!first)
2559 {
2560 ol.docify(", ");
2561 }
2562 first=false;
2563 ol.docify(s);
2564 }
2565 ol.docify("]");
2566 ol.endTypewriter();
2567 }
2568
2569 if (writeAnchor)
2570 {
2571 ol.endDoxyAnchor(cfname,anchor());
2572 }
2573
2574 //printf("endMember %s annoClassDef=%p annEnumType=%p\n",
2575 // qPrint(name()),annoClassDef,annEnumType);
2576 ol.endMemberItem(anonType);
2577 if (endAnonScopeNeeded)
2578 {
2579 ol.endAnonTypeScope(indentLevel);
2580 }
2581
2582 // write brief description
2583 if (!briefDescription().empty() &&
2584 Config_getBool(BRIEF_MEMBER_DESC)
2585 )
2586 {
2587 auto parser { createDocParser() };
2588 auto ast { validatingParseDoc(*parser.get(),
2589 briefFile(),
2590 briefLine(),
2592 this,
2594 DocOptions()
2595 .setIndexWords(inheritedFrom==nullptr)
2596 .setSingleLine(true))
2597 };
2598 if (!ast->empty())
2599 {
2600 ol.startMemberDescription(anchor(),inheritId);
2601 ol.writeDoc(ast.get(),getOuterScope()?getOuterScope():d,this);
2602 if (detailsVisible) // add More.. link only when both brief and details are visible
2603 {
2604 if (!isAnonymous()) // hide anonymous stuff
2605 {
2606 ol.pushGeneratorState();
2608 ol.docify(" ");
2609 ol.popGeneratorState();
2610 }
2611 }
2612 // for RTF we need to add an extra empty paragraph
2613 ol.pushGeneratorState();
2615 ol.startParagraph();
2616 ol.endParagraph();
2617 ol.popGeneratorState();
2619 }
2620 }
2621
2622 ol.endMemberDeclaration(anchor(),inheritId);
2623
2625 //printf("< %s MemberDefImpl::writeDeclaration() inGroup=%d\n",qPrint(qualifiedName()),inGroup);
2626}
2627
2629
2631{
2632 std::lock_guard<std::mutex> lock(g_hasDetailedDescriptionMutex);
2633 //printf(">hasDetailedDescription(cached=%d)\n",m_hasDetailedDescriptionCached);
2635 {
2636 bool extractAll = Config_getBool(EXTRACT_ALL);
2637 bool alwaysDetailedSec = Config_getBool(ALWAYS_DETAILED_SEC);
2638 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
2639 bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
2640 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
2641 bool extractStatic = Config_getBool(EXTRACT_STATIC);
2642 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
2643 bool inlineSources = hasInlineSource();
2644 bool includes = Config_getBool(SHOW_INCLUDE_FILES) && m_incInfo!=nullptr;
2645
2646 // the member has detailed documentation because the user added some comments
2647 bool docFilter =
2648 // extract all is enabled
2649 extractAll ||
2650 // has detailed docs
2651 !documentation().empty() ||
2652 // has inbody docs
2654 // is an enum with values that are documented
2656 // is documented enum value
2657 (m_mtype==MemberType::EnumValue && !briefDescription().empty()) ||
2658 // has brief description that is part of the detailed description
2659 (!briefDescription().empty() && // has brief docs
2660 (alwaysDetailedSec && // they are visible in
2661 (repeatBrief || // detailed section or
2662 !briefMemberDesc // they are explicitly not
2663 ) // shown in brief section
2664 )
2665 ) ||
2666 // has one or more documented arguments
2671 m_templateMaster->templateArguments().hasTemplateDocumentation() :
2673 // user-specified qualifiers
2674 !m_qualifiers.empty();
2675
2676 // generate function guard
2677 // ================== =======
2678 // _writeGroupInclude -> ignored in calculation
2679 // multiLineInitializer() -> hasMultiLineInitializer()
2680 // _writeReimplements -> _isReimplements()
2681 // _writeReimplementedBy -> _countReimplementedBy()>0
2682 // _writeExamples -> hasExamples()
2683 // _writeTypeConstraints -> m_typeConstraints.hasParameters()
2684 // writeSourceDef -> !getSourceFileBase().empty();
2685 // writeInlineCode -> hasInlineSource() && hasSources()
2686 // writeSourceRefs -> hasReferencesRelation() && hasSourceRefs()
2687 // writeSourceReffedBy -> hasReferencedByRelation() && hasSourceReffedBy()
2688 // _writeCallGraph -> _hasVisibleCallGraph()
2689 // _writeCallerGraph -> _hasVisibleCallerGraph()
2690
2691 // the member has detailed documentation because there is some generated info
2692 bool docInfo =
2693 // has a multi-line initialization block
2695 // reimplements / reimplemented by
2697 // examples
2698 hasExamples() ||
2699 // type constraints
2701 // has source definition
2702 !getSourceFileBase().empty() ||
2703 // has inline sources
2704 (inlineSources && hasSources()) ||
2705 // has references
2708 // call graph
2710 // caller graph
2712 // requirement references
2714 // has \headerfile command
2715 includes;
2716
2717 if (!hideUndocMembers) // if HIDE_UNDOC_MEMBERS is NO we also show the detailed section
2718 // if there is only some generated info
2719 {
2720 docFilter = docFilter || docInfo;
2721 }
2722
2723 // this is not a global static or global statics should be extracted
2724 bool staticFilter = getClassDef()!=nullptr || !isStatic() || extractStatic;
2725
2726 // a module does not contain details for members, so either the namespace or file should be linkable
2727 bool moduleFilter = getModuleDef()==nullptr || (getFileDef() && getFileDef()->isLinkable()) ||
2730
2731 // only include members that are non-private unless EXTRACT_PRIVATE is
2732 // set to YES or the member is part of a group
2733 bool privateFilter = protectionLevelVisible(protection()) || m_mtype==MemberType::Friend ||
2734 (m_prot==Protection::Private && (m_virt!=Specifier::Normal || isOverride() || isFinal()) && extractPrivateVirtual);
2735
2736 // hide friend (class|struct|union) member if HIDE_FRIEND_COMPOUNDS
2737 // is true
2738 bool friendCompoundFilter = !(Config_getBool(HIDE_FRIEND_COMPOUNDS) && isFriend());
2739
2741 (docFilter && staticFilter && moduleFilter && privateFilter && friendCompoundFilter && !isHidden());
2742 //printf("docFilter=%d docInfo=%d staticFilter=%d privateFilter=%d friendCompoundFilter=%d !isHidden()=%d",
2743 // docFilter,docInfo,staticFilter,privateFilter,friendCompoundFilter,!isHidden());
2745 }
2746 //printf("<hasDetailedDescription(cached=%d)\n",m_hasDetailedDescriptionCached);
2748}
2749
2751{
2752 bool separateMemPages = Config_getBool(SEPARATE_MEMBER_PAGES);
2753 bool inlineSimpleStructs = Config_getBool(INLINE_SIMPLE_STRUCTS);
2754 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
2755 bool groupFilter = getGroupDef()==nullptr || container==MemberListContainer::Group || separateMemPages;
2756 bool fileFilter = getNamespaceDef()==nullptr || !getNamespaceDef()->isLinkable() || container!=MemberListContainer::File;
2757 bool simpleFilter = (hasBriefDescription() || !hideUndocMembers) && inlineSimpleStructs &&
2758 getClassDef()!=nullptr && getClassDef()->isSimple();
2759
2760 bool visible = hasDetailedDescription() && groupFilter && fileFilter &&
2761 !isReference();
2762 bool result = visible || simpleFilter;
2763 //printf("%s::isDetailedSectionVisible: %d groupFilter=%d fileFilter=%d\n",
2764 // qPrint(name()),result,groupFilter,fileFilter);
2765 return result;
2766}
2767
2769{
2770 StringVector sl;
2771 bool inlineInfo = Config_getBool(INLINE_INFO);
2772 bool inherited = getClassDef() &&
2773 (getClassDef()!=container || m_explicitInherited) &&
2774 container->definitionType()==TypeClass &&
2775 !isRelated();
2776 Specifier lvirt=virtualness();
2777 if ((!isObjCMethod() || isOptional() || isRequired()) &&
2778 (protection()!=Protection::Public || lvirt!=Specifier::Normal ||
2779 isFriend() || isRelated() ||
2780 (isInline() && inlineInfo) ||
2781 isSignal() || isSlot() ||
2782 isStatic() || isExternal() ||
2783 isExported() ||
2784 inherited ||
2785 TypeSpecifier(m_memSpec).setInline(false)!=TypeSpecifier()
2786 )
2787 )
2788 {
2789 // write the member specifier list
2790 //ol.writeLatexSpacing();
2791 //ol.startTypewriter();
2792 //ol.docify(" [");
2793 SrcLangExt lang = getLanguage();
2794 bool optVhdl = lang==SrcLangExt::VHDL;
2795 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
2796 if (optVhdl)
2797 {
2798 sl.push_back(theTranslator->trVhdlType(getVhdlSpecifiers(),true).str());
2799 }
2800 else
2801 {
2802 if (isFriend()) sl.emplace_back("friend");
2803 else if (isRelated()) sl.emplace_back("related");
2804 else
2805 {
2806 if (isExternal()) sl.emplace_back("extern");
2807 if (inlineInfo && isInline()) sl.emplace_back("inline");
2808 if (isExplicit()) sl.emplace_back("explicit");
2809 if (isMutable()) sl.emplace_back("mutable");
2810 if (isThreadLocal()) sl.emplace_back("thread_local");
2811 if (isStatic()) sl.emplace_back("static");
2812 if (isGettable()) sl.emplace_back("get");
2813 if (isProtectedGettable()) sl.emplace_back("protected get");
2814 if (isSettable()) sl.emplace_back("set");
2815 if (isProtectedSettable()) sl.emplace_back("protected set");
2816 if (extractPrivate)
2817 {
2818 if (isPrivateGettable()) sl.emplace_back("private get");
2819 if (isPrivateSettable()) sl.emplace_back("private set");
2820 }
2821 if (isNoDiscard()) sl.emplace_back("nodiscard");
2822 if (isConstExpr()) sl.emplace_back("constexpr");
2823 if (isConstEval()) sl.emplace_back("consteval");
2824 if (isConstInit()) sl.emplace_back("constinit");
2825 if (isAddable()) sl.emplace_back("add");
2826 if (!isUNOProperty() && isRemovable()) sl.emplace_back("remove");
2827 if (isRaisable()) sl.emplace_back("raise");
2828 if (isReadable()) sl.emplace_back("read");
2829 if (isWritable()) sl.emplace_back("write");
2830 if (isFinal()) sl.emplace_back("final");
2831 if (isAbstract()) sl.emplace_back("abstract");
2832 if (isOverride()) sl.emplace_back("override");
2833 if (isInitonly()) sl.emplace_back("initonly");
2834 if (isSealed()) sl.emplace_back("sealed");
2835 if (isNew()) sl.emplace_back("new");
2836 if (isOptional()) sl.emplace_back("optional");
2837 if (isRequired()) sl.emplace_back("required");
2838 if (isExported()) sl.emplace_back("export");
2839
2840 if (isNonAtomic()) sl.emplace_back("nonatomic");
2841 else if (isObjCProperty()) sl.emplace_back("atomic");
2842
2843 // mutual exclusive Objective 2.0 property attributes
2844 if (isAssign()) sl.emplace_back("assign");
2845 else if (isCopy()) sl.emplace_back("copy");
2846 else if (isRetain()) sl.emplace_back("retain");
2847 else if (isWeak()) sl.emplace_back("weak");
2848 else if (lang!=SrcLangExt::CSharp && isStrong()) sl.emplace_back("strong");
2849 else if (isUnretained()) sl.emplace_back("unsafe_unretained");
2850
2851 if (!isObjCMethod())
2852 {
2853 if (protection()==Protection::Protected) sl.emplace_back("protected");
2854 else if (protection()==Protection::Private) sl.emplace_back("private");
2855 else if (protection()==Protection::Package) sl.emplace_back("package");
2856
2857 if (lvirt==Specifier::Virtual) sl.emplace_back("virtual");
2858 else if (lvirt==Specifier::Pure) sl.emplace_back("pure virtual");
2859 if (isSignal()) sl.emplace_back("signal");
2860 if (isSlot()) sl.emplace_back("slot");
2861 if (isDefault()) sl.emplace_back("default");
2862 if (isDelete()) sl.emplace_back("delete");
2863 if (isNoExcept()) sl.emplace_back("noexcept");
2864 if (isAttribute()) sl.emplace_back("attribute");
2865 if (isUNOProperty()) sl.emplace_back("property");
2866 if (isReadonly()) sl.emplace_back("readonly");
2867 if (isBound()) sl.emplace_back("bound");
2868 if (isUNOProperty() && isRemovable()) sl.emplace_back("removable");
2869 if (isConstrained()) sl.emplace_back("constrained");
2870 if (isTransient()) sl.emplace_back("transient");
2871 if (isMaybeVoid()) sl.emplace_back("maybevoid");
2872 if (isMaybeDefault()) sl.emplace_back("maybedefault");
2873 if (isMaybeAmbiguous()) sl.emplace_back("maybeambiguous");
2874 if (isPublished()) sl.emplace_back("published"); // enum
2875 }
2877 {
2878 sl.emplace_back("implementation");
2879 }
2880 }
2881 if (inherited)
2882 {
2883 sl.emplace_back("inherited");
2884 }
2885 }
2886 }
2887 else if (isObjCMethod() && isImplementation())
2888 {
2889 sl.emplace_back("implementation");
2890 }
2891
2892 for (const auto &sx : m_qualifiers)
2893 {
2894 bool alreadyAdded = std::find(sl.begin(), sl.end(), sx) != sl.end();
2895 if (!alreadyAdded)
2896 {
2897 sl.push_back(sx);
2898 }
2899 }
2900
2901 return sl;
2902}
2903
2905{
2906 // write call graph
2908 {
2909 DotCallGraph callGraph(this,false);
2910 if (callGraph.isTooBig())
2911 {
2912 warn_uncond("Call graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
2913 qualifiedName(), callGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
2914 }
2915 else if (!callGraph.isTrivial())
2916 {
2917 msg("Generating call graph for function {}\n",qualifiedName());
2919 ol.startCallGraph();
2921 ol.endCallGraph(callGraph);
2922 ol.enableAll();
2923 }
2924 }
2925}
2926
2928{
2930 {
2931 DotCallGraph callerGraph(this, true);
2932 if (callerGraph.isTooBig())
2933 {
2934 warn_uncond("Caller graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
2935 qualifiedName(), callerGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
2936 }
2937 else if (!callerGraph.isTrivial())
2938 {
2939 msg("Generating caller graph for function {}\n",qualifiedName());
2941 ol.startCallGraph();
2943 ol.endCallGraph(callerGraph);
2944 ol.enableAll();
2945 }
2946 }
2947}
2948
2950{
2951 const MemberDef *bmd=reimplements();
2952 const ClassDef *bcd=nullptr;
2953 if (bmd && (bcd=bmd->getClassDef()))
2954 {
2955 // write class that contains a member that is reimplemented by this one
2956 if (bcd->isLinkable())
2957 {
2958 return true;
2959 }
2960 }
2961 return false;
2962}
2964{
2965 const MemberDef *bmd=reimplements();
2966 const ClassDef *bcd=nullptr;
2967 if (bmd && (bcd=bmd->getClassDef()))
2968 {
2969 // write class that contains a member that is reimplemented by this one
2970 if (bcd->isLinkable())
2971 {
2972 ol.startParagraph();
2973 DString reimplFromLine;
2974 if (bmd->virtualness()!=Specifier::Pure && bcd->compoundType()!=ClassDef::Interface)
2975 {
2976 reimplFromLine = theTranslator->trReimplementedFromList(1);
2977 }
2978 else
2979 {
2980 reimplFromLine = theTranslator->trImplementedFromList(1);
2981 }
2982 if (size_t markerPos = reimplFromLine.find("@0"); markerPos!=DString::npos) // should always pass this.
2983 {
2984 ol.parseText(reimplFromLine.left(markerPos)); //text left from marker
2985 if (bmd->isLinkable()) // replace marker with link
2986 {
2987 //Definition *bd=bmd->group;
2988 //if (bd==0) bd=bcd;
2990 bmd->anchor(),bcd->displayName());
2991
2992 //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
2993 // bmd->anchor(),bcd->name());
2994 if ( bmd->isLinkableInProject() )
2995 {
2996 writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
2997 }
2998 }
2999 else
3000 {
3002 DString(),bcd->displayName());
3003 if (bcd->isLinkableInProject()/* && !Config_getBool(PDF_HYPERLINKS)*/ )
3004 {
3005 writePageRef(ol,bcd->getOutputFileBase(),bcd->anchor());
3006 }
3007 }
3008 ol.parseText(reimplFromLine.right(
3009 reimplFromLine.length()-markerPos-2)); // text right from marker
3010
3011 }
3012 else
3013 {
3014 err("translation error: no marker in trReimplementsFromList()\n");
3015 }
3016 ol.endParagraph();
3017 }
3018 }
3019}
3020
3022{
3023 const MemberVector &bml=reimplementedBy();
3024 size_t count=0;
3025 for (const auto &bmd : bml)
3026 {
3027 const ClassDef *bcd=bmd->getClassDef();
3028 // count the members that directly inherit from md and for
3029 // which the member and class are visible in the docs.
3030 if ( bcd && bmd->isLinkable() && bcd->isLinkable() )
3031 {
3032 count++;
3033 }
3034 }
3035 return count;
3036}
3037
3039{
3040 const MemberVector &bml=reimplementedBy();
3041 size_t count = _countReimplementedBy();
3042 if (count>0)
3043 {
3044 auto replaceFunc = [&bml,&ol](size_t entryIndex)
3045 {
3046 size_t cnt=0;
3047 auto it = bml.begin();
3048 // find the entryIndex-th documented entry in the inheritance list.
3049 const MemberDef *bmd = nullptr;
3050 const ClassDef *bcd = nullptr;
3051 while (it!=bml.end())
3052 {
3053 bmd = *it;
3054 bcd = bmd->getClassDef();
3055 if ( bmd->isLinkable() && bcd->isLinkable())
3056 {
3057 if (cnt==entryIndex) break;
3058 cnt++;
3059 }
3060 ++it;
3061 }
3062
3063 if (bcd && bmd) // write link for marker
3064 {
3065 //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
3066 // bmd->anchor(),bcd->name());
3068 bmd->anchor(),bcd->displayName());
3069
3070 if (bmd->isLinkableInProject() )
3071 {
3072 writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
3073 }
3074 }
3075 };
3076
3077 DString reimplInLine;
3078 if (m_virt==Specifier::Pure || (getClassDef() && getClassDef()->compoundType()==ClassDef::Interface))
3079 {
3080 reimplInLine = theTranslator->trImplementedInList(static_cast<int>(count));
3081 }
3082 else
3083 {
3084 reimplInLine = theTranslator->trReimplementedInList(static_cast<int>(count));
3085 }
3086
3087 // write the list of classes that overwrite this member
3088 ol.startParagraph();
3089 writeMarkerList(ol,
3090 reimplInLine.str(),
3091 count,
3092 replaceFunc);
3093 ol.endParagraph();
3094 }
3095}
3096
3098{
3099 if (getClassDef()) // this should be a member of a class/category
3100 {
3101 //printf("%s: category %s relation %s class=%s categoryOf=%s\n",
3102 // qPrint(name()),
3103 // m_category ? qPrint(m_category->name()) : "<none>",
3104 // m_categoryRelation ? qPrint(m_categoryRelation->name()) : "<none>",
3105 // qPrint(m_classDef->name()),
3106 // m_classDef->categoryOf() ? qPrint(m_classDef->categoryOf()->name()) : "<none>"
3107 // );
3108 DString text;
3109 DString ref;
3110 DString file;
3111 DString anc;
3112 DString name;
3113 size_t i=DString::npos;
3115 {
3116 if (m_category)
3117 {
3118 // this member is in a normal class and implements method categoryRelation from category
3119 // so link to method 'categoryRelation' with 'provided by category 'category' text.
3122 }
3123 else if (getClassDef()->categoryOf())
3124 {
3125 // this member is part of a category so link to the corresponding class member of the class we extend
3126 // so link to method 'categoryRelation' with 'extends class 'classDef->categoryOf()'
3127 text = theTranslator->trExtendsClass();
3129 }
3130 i=text.find("@0");
3131 if (i!=DString::npos)
3132 {
3133 const MemberDef *md = m_categoryRelation;
3134 ref = md->getReference();
3135 file = md->getOutputFileBase();
3136 anc = md->anchor();
3137 }
3138 }
3139 if (i!=DString::npos && !name.empty())
3140 {
3141 ol.startParagraph();
3142 ol.parseText(text.left(i));
3143 ol.writeObjectLink(ref,file,anc,name);
3144 ol.parseText(text.mid(i+2));
3145 ol.endParagraph();
3146 }
3147 }
3148}
3149
3151{
3152 // write the list of examples that use this member
3153 if (hasExamples())
3154 {
3155 ol.startExamples();
3156 ol.startDescForItem();
3158 ol.endDescForItem();
3159 ol.endExamples();
3160 }
3161}
3162
3170
3172 const DString &cfname,const DString &ciname,
3173 const DString &cname) const
3174{
3175 // For enum, we also write the documented enum values
3176 if (isEnumerate())
3177 {
3178 bool first=true;
3179 //printf("** %s: enum values=%zu\n",qPrint(name()),enumFieldList().size());
3180 bool hasInits = false;
3181 if (hasEnumValues())
3182 {
3183 for (const auto &fmd : enumFieldList())
3184 {
3185 if (fmd->isLinkable())
3186 {
3187 if (!fmd->initializer().empty())
3188 {
3189 hasInits = true;
3190 break;
3191 }
3192 }
3193 }
3194 }
3195 for (const auto &fmd : enumFieldList())
3196 {
3197 //printf("Enum %p: isLinkable()=%d\n",fmd,fmd->isLinkable());
3198 if (fmd->isLinkable())
3199 {
3200 if (first)
3201 {
3203 first=false;
3204 }
3205
3206 ol.startDescTableRow();
3207 ol.addIndexItem(fmd->name(),ciname);
3208 ol.addIndexItem(ciname,fmd->name());
3209
3211 ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString());
3212 ol.addLabel(cfname,fmd->anchor());
3213 ol.docify(fmd->name());
3215 ol.writeString(" ");
3216 ol.enableAll();
3217 ol.endDoxyAnchor(cfname,fmd->anchor());
3218 ol.endDescTableTitle();
3219 if (hasInits)
3220 {
3221 ol.startDescTableInit();
3222 if (!fmd->initializer().empty())
3223 {
3224 DString initStr = fmd->initializer().stripWhiteSpace();
3225 if (initStr.startsWith("=")) initStr = initStr.mid(1).stripWhiteSpace();
3227 ol.writeString("(");
3228 ol.enableAll();
3229 ol.docify(initStr);
3231 ol.writeString(")");
3232 ol.enableAll();
3233 }
3234 ol.endDescTableInit();
3235 }
3236 ol.startDescTableData();
3237
3238 bool hasBrief = !fmd->briefDescription().empty();
3239 bool hasDetails = !fmd->documentation().empty();
3240
3241 if (hasBrief)
3242 {
3243 ol.generateDoc(fmd->briefFile(),
3244 fmd->briefLine(),
3245 getOuterScope()?getOuterScope():container,
3246 fmd,
3247 fmd->briefDescription(),
3248 DocOptions()
3249 .setIndexWords(true));
3250 }
3251 if (hasDetails)
3252 {
3253 ol.generateDoc(fmd->docFile(),
3254 fmd->docLine(),
3255 getOuterScope()?getOuterScope():container,
3256 fmd,
3257 fmd->documentation()+"\n",
3258 DocOptions()
3259 .setIndexWords(true));
3260 }
3261 ol.endDescTableData();
3262 ol.endDescTableRow();
3263 }
3264 }
3265 if (!first)
3266 {
3267 ol.endDescTable();
3268 }
3269 }
3270}
3271
3272// match from the start of the scope until the last marker
3273static const reg::Ex reAnonymous(R"([\w:@]*@\d+)");
3274
3276{
3277 DString ldef = definition();
3278 DString title = name();
3279 if (isEnumerate())
3280 {
3281 if (isAnonymous())
3282 {
3283 ldef = title = "anonymous enum";
3284 if (!m_enumBaseType.empty())
3285 {
3286 ldef+=" : "+m_enumBaseType;
3287 }
3288 }
3289 else
3290 {
3291 ldef.prepend("enum ");
3292 if (isSliceLocal())
3293 {
3294 ldef.prepend("local ");
3295 }
3296 }
3297 }
3298 else if (isEnumValue())
3299 {
3300 if (isAnonymous())
3301 {
3302 ldef=ldef.mid(2);
3303 }
3304 }
3305
3306 std::string sdef = ldef.str();
3307 reg::Match match;
3308 if (reg::search(sdef,match,reAnonymous))
3309 {
3310 const ClassDef *annoClassDef=getClassDefOfAnonymousType();
3311 if (annoClassDef)
3312 {
3313 static const reg::Ex ar(R"([\w@:]*@\d+[\w@:]*)");
3314 reg::Match amatch;
3315 reg::search(sdef,amatch,ar);
3316 ldef = amatch.prefix().str() + annoClassDef->displayName() + amatch.suffix().str();
3317 }
3318 else
3319 {
3320 ldef = match.prefix().str() + " { ... } " + removeAnonymousScopes(match.suffix().str());
3321 }
3322 }
3323
3324 const ClassDef *cd=getClassDef();
3325 if (cd && cd->isObjectiveC())
3326 {
3327 // strip scope name
3328 if (size_t ep = ldef.find("::"); ep!=DString::npos)
3329 {
3330 if (size_t sp=ldef.rfind(' ',ep); sp!=DString::npos)
3331 {
3332 ldef=ldef.left(sp+1)+ldef.mid(ep+2);
3333 }
3334 }
3335 // strip keywords
3336 if (size_t dp = ldef.find(':'); dp!=DString::npos)
3337 {
3338 ldef=ldef.left(dp+1);
3339 }
3340 int l=static_cast<int>(ldef.length());
3341 //printf("start >%s<\n",qPrint(ldef));
3342 int i=l-1;
3343 while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
3344 while (i>=0 && isspace(static_cast<uint8_t>(ldef.at(i)))) i--;
3345 if (i>0)
3346 {
3347 // insert branches around the type
3348 ldef = "("+ldef.left(i+1)+")"+ldef.mid(i+1);
3349 }
3350 //printf("end >%s< i=%d\n",qPrint(ldef),i);
3351 if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
3352 }
3353 SrcLangExt lang = getLanguage();
3354 DString sep = getLanguageSpecificSeparator(lang,true);
3355 return substitute(ldef,"::",sep);
3356}
3357
3359{
3360 SrcLangExt lang = getLanguage();
3361 bool written = false;
3362 if (m_incInfo) // explicit \headerfile command
3363 {
3364 DString nm=m_incInfo->includeName.empty() ?
3365 (m_incInfo->fileDef ?
3366 m_incInfo->fileDef->docName() : DString()
3367 ) : m_incInfo->includeName;
3368 if (!nm.empty())
3369 {
3370 ol.startParagraph();
3371 ol.startTypewriter();
3372 ol.docify(::includeStatement(lang,m_incInfo->kind));
3373 ol.docify(::includeOpen(lang,m_incInfo->kind));
3374 ol.pushGeneratorState();
3376 ol.docify(nm);
3379 if (m_incInfo->fileDef)
3380 {
3381 ol.writeObjectLink(DString(),m_incInfo->fileDef->includeName(),DString(),nm);
3382 }
3383 else
3384 {
3385 ol.docify(nm);
3386 }
3387 ol.popGeneratorState();
3388 ol.docify(::includeClose(lang,m_incInfo->kind));
3389 ol.endTypewriter();
3390 ol.endParagraph();
3391 written = true;
3392 }
3393 }
3394 if (!written) // only write out the include file if this is not part of a class or file definition
3395 {
3396 bool showGroupedMembInc = Config_getBool(SHOW_GROUPED_MEMB_INC);
3397 bool forceLocalIncludes = Config_getBool(FORCE_LOCAL_INCLUDES);
3398 const FileDef *fd = getFileDef();
3399 DString nm;
3400 if (inGroup && fd && showGroupedMembInc)
3401 {
3402 if (!Config_getList(STRIP_FROM_INC_PATH).empty())
3403 {
3405 }
3406 else
3407 {
3408 nm = fd->name();
3409 }
3410 }
3411 if (!nm.empty())
3412 {
3413 ol.startParagraph();
3414 ol.startTypewriter();
3415 bool isIDLorJava = lang==SrcLangExt::IDL || lang==SrcLangExt::Java;
3416 if (isIDLorJava)
3417 {
3418 ol.docify("import ");
3419 }
3420 else
3421 {
3422 ol.docify("#include ");
3423 }
3424
3425 if (isIDLorJava || forceLocalIncludes) ol.docify("\""); else ol.docify("<");
3426
3427 if (fd && fd->isLinkable())
3428 {
3429 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),fd->anchor(),nm);
3430 }
3431 else
3432 {
3433 ol.docify(nm);
3434 }
3435
3436 if (isIDLorJava || forceLocalIncludes) ol.docify("\""); else ol.docify(">");
3437
3438 ol.endTypewriter();
3439 ol.endParagraph();
3440 }
3441 }
3442}
3443
3445{
3446 //printf("md=%s initLines=%d init='%s'\n",qPrint(name()),initLines,qPrint(init));
3447 ol.startBold();
3448 if (m_mtype==MemberType::Define)
3450 else
3452 ol.endBold();
3453 DString langCorrected = getDefFileExtension();
3455 if (srcLangExt == SrcLangExt::Lex)
3456 {
3457 langCorrected = ".doxygen_lex_c";
3458 srcLangExt = SrcLangExt::Cpp;
3459 }
3460 auto intf = Doxygen::parserManager->getCodeParser(langCorrected);
3461 intf->resetCodeParserState();
3462 auto &codeOL = ol.codeGenerators();
3463 codeOL.startCodeFragment("DoxyCode");
3464 intf->parseCode(codeOL,scopeName,m_initializer,srcLangExt,Config_getBool(STRIP_CODE_COMMENTS),
3467 .setInlineFragment(true)
3468 .setMemberDef(this)
3469 .setShowLineNumbers(false)
3470 .setSearchCtx(this)
3471 );
3472 codeOL.endCodeFragment("DoxyCode");
3473}
3474
3475/*! Writes the "detailed documentation" section of this member to
3476 * all active output formats.
3477 */
3479 int memCount,int memTotal,
3480 OutputList &ol,
3481 const DString &scName,
3482 const Definition *container,
3483 bool inGroup,
3484 bool /* showEnumValues */,
3485 bool showInline
3486 ) const
3487{
3488 // if this member is in a group find the real scope name.
3489 bool hasParameterList = false;
3490
3491 //printf("MemberDefImpl::writeDocumentation(): name='%s' hasDocs='%d' containerType=%d inGroup=%d sectionLinkable=%d\n",
3492 // qPrint(name()),hasDocs,container->definitionType(),inGroup,hasDetailedDescription());
3493
3494 //if ( !hasDocs ) return;
3495 //if (isEnumValue() && !showEnumValues) return;
3496
3497 SrcLangExt lang = getLanguage();
3498 //printf("member=%s lang=%d\n",qPrint(name()),lang);
3499 bool optVhdl = lang==SrcLangExt::VHDL;
3500 DString sep = getLanguageSpecificSeparator(lang,true);
3501
3502 DString scopeName = scName;
3503 DString memAnchor = anchor();
3504 DString ciname = container->displayName();
3505 const Definition *scopedContainer = container; // see bug 753608
3506 if (container->definitionType()==TypeGroup)
3507 {
3508 if (getClassDef()) { scopeName=getClassDef()->displayName(); scopedContainer=getClassDef(); }
3509 else if (getNamespaceDef()) { scopeName=getNamespaceDef()->displayName(); scopedContainer=getNamespaceDef(); }
3510 else if (getFileDef()) { scopeName=getFileDef()->displayName(); scopedContainer=getFileDef(); }
3511 ciname = (toGroupDef(container))->groupTitle();
3512 }
3513 else if (container->definitionType()==TypeFile && getNamespaceDef() && getNamespaceDef()->isLinkable())
3514 { // member is in a namespace, but is written as part of the file documentation
3515 // as well, so we need to make sure its anchor is unique (it is not really used).
3516 memAnchor.prepend("file_");
3517 }
3518
3519 DString cname = container->name();
3520 DString cfname = getOutputFileBase();
3521
3522 // get member name
3523 DString doxyName=name();
3524 // prepend scope if there is any. TODO: make this optional for C only docs
3525 if (!scopeName.empty())
3526 {
3527 doxyName.prepend(scopeName+sep);
3528 }
3529 DString doxyArgs=argsString();
3530
3531 DString ldef = definition();
3532 DString title = name();
3533
3534 //printf("member '%s' def='%s'\n",qPrint(name()),qPrint(ldef));
3535 if (isEnumerate())
3536 {
3537 if (title.at(0)=='@')
3538 {
3539 ldef = title = "anonymous enum";
3540 if (isSliceLocal())
3541 {
3542 ldef.prepend("local ");
3543 }
3544 if (lang==SrcLangExt::Cpp)
3545 {
3546 if (isEnumStruct()) ldef.append(" struct");
3547 else if (isStrong()) ldef.append(" class");
3548 }
3549 if (!m_enumBaseType.empty())
3550 {
3551 ldef+=" : "+m_enumBaseType;
3552 }
3553 }
3554 else
3555 {
3556 if (lang==SrcLangExt::Cpp)
3557 {
3558 if (isEnumStruct()) ldef.prepend("struct ");
3559 else if (isStrong()) ldef.prepend("class ");
3560 }
3561 ldef.prepend("enum ");
3562 if (isSliceLocal())
3563 {
3564 ldef.prepend("local ");
3565 }
3566 }
3567 }
3568 else if (isEnumValue())
3569 {
3570 if (ldef.at(0)=='@')
3571 {
3572 ldef=ldef.mid(2);
3573 }
3574 }
3575 else if (isFunction() && !isObjCMethod())
3576 {
3577 title += "()";
3578 }
3579 if (lang == SrcLangExt::Slice)
3580 {
3581 // Remove the container scope from the member name.
3582 DString prefix = scName + sep;
3583 if (size_t pos = ldef.rfind(prefix); pos != DString::npos)
3584 {
3585 ldef.remove(pos, prefix.length());
3586 }
3587 }
3588 ldef.stripPrefix("constexpr ");
3589 ldef.stripPrefix("consteval ");
3590 ldef.stripPrefix("constinit ");
3591 ldef.stripPrefix("static ");
3592
3593 //----------------------------------------
3594
3595 ol.pushGeneratorState();
3596
3597 bool htmlEndLabelTable=false;
3598 StringVector sl = getLabels(scopedContainer);
3599
3600 static const reg::Ex r(R"(@\d+)");
3601 reg::Match match;
3602 std::string sdef = ldef.str();
3603 LinkifyTextOptions options;
3604 options.setScope(scopedContainer).setFileScope(getBodyDef()).setSelf(this);
3605 if ((isVariable() || isTypedef()) && reg::search(sdef,match,r))
3606 {
3607 // find enum type and insert it in the definition
3608 bool found=false;
3609 for (const auto &vmd : *ml)
3610 {
3611 if (vmd->isEnumerate() && match.str()==vmd->name())
3612 {
3613 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3614 ol.startMemberDoc(ciname,name(),memAnchor,name(),memCount,memTotal,showInline);
3615 ol.addLabel(cfname, memAnchor);
3616 DString prefix = match.prefix().str();
3617 DString suffix = match.suffix().str();
3619 vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef(),getModuleDef());
3620 linkifyText(TextGeneratorOLImpl(ol),suffix,options);
3621
3622 found=true;
3623 break;
3624 }
3625 }
3626 if (!found) // anonymous compound
3627 {
3628 const ClassDef *annoClassDef=getClassDefOfAnonymousType();
3629 DString typeName;
3630 if (annoClassDef) typeName=annoClassDef->compoundTypeString();
3631 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3632 ol.startMemberDoc(ciname,name(),memAnchor,title,memCount,memTotal,showInline);
3633 ol.addLabel(cfname, memAnchor);
3634 // search for the last anonymous compound name in the definition
3635
3637 if (reg::search(sdef,match,reAnonymous))
3638 {
3639 static const reg::Ex ar(R"([\w@:]*@\d+[\w@:]*)");
3640 reg::Match amatch;
3641 reg::search(sdef,amatch,ar);
3642 DString prefix = amatch.prefix().str();
3643 DString suffix = removeAnonymousScopes(amatch.suffix().str());
3644 //printf("writeDocumentation(): anonymous compound in definition: sdef='%s' prefix='%s' suffix='%s' annoClassDef=%p\n",
3645 // qPrint(sdef), qPrint(prefix),qPrint(suffix),(void*)annoClassDef);
3646 const MemberDef *amd = getAnonymousEnumType();
3647 if (annoClassDef && amd==nullptr)
3648 {
3649 ol.docify(prefix);
3650 DString annTypeName = annoClassDef->displayName(true);
3651 if (suffix.empty())
3652 {
3653 suffix="::"+localName();
3654 }
3655 ol.writeObjectLink(annoClassDef->getReference(),annoClassDef->getOutputFileBase(),
3656 annoClassDef->anchor(),annTypeName);
3657 linkifyText(TextGeneratorOLImpl(ol),suffix,options);
3658 }
3659 else if (amd) // type is an anonymous enum
3660 {
3661 DString typePlaceholder = " { ... } ";
3662 if (lang==SrcLangExt::Cpp)
3663 {
3664 if (amd->isEnumStruct()) typePlaceholder.prepend(" struct");
3665 else if (amd->isStrong()) typePlaceholder.prepend(" class");
3666 }
3667 ol.writeObjectLink(amd->getReference(),amd->getOutputFileBase(),amd->anchor(),prefix+typePlaceholder+suffix);
3668 }
3669 else
3670 {
3671 prefix = match.prefix().str();
3672 suffix = removeAnonymousScopes(match.suffix().str());
3673 ol.docify(prefix);
3674 ol.docify(" ");
3676 //ol.docify(" { ... } ");
3677 linkifyText(TextGeneratorOLImpl(ol),suffix,options);
3678 }
3679 }
3680 else
3681 {
3682 linkifyText(TextGeneratorOLImpl(ol),ldef,options);
3683 }
3684 }
3685 }
3686 else // not an enum value or anonymous compound
3687 {
3688 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3689 ol.startMemberDoc(ciname,name(),memAnchor,title,memCount,memTotal,showInline);
3690 ol.addLabel(cfname, memAnchor);
3691
3692 if (!m_metaData.empty() && getLanguage()==SrcLangExt::Slice)
3693 {
3695 ol.docify(m_metaData);
3697 }
3698
3699 const ClassDef *cd=getClassDef();
3700 const NamespaceDef *nd=getNamespaceDef();
3701 if (!m_defTmpArgLists.empty() && lang==SrcLangExt::Cpp)
3702 // definition has explicit template parameter declarations
3703 {
3704 for (const ArgumentList &tal : m_defTmpArgLists)
3705 {
3706 if (!tal.empty())
3707 {
3709 _writeTemplatePrefix(ol,scopedContainer,tal);
3711 }
3712 }
3713 }
3714 else // definition gets it template parameters from its class
3715 // (since no definition was found)
3716 {
3717 if (cd && lang==SrcLangExt::Cpp && !isTemplateSpecialization())
3718 {
3719 for (const ArgumentList &tal : cd->getTemplateParameterLists())
3720 {
3721 if (!tal.empty())
3722 {
3724 _writeTemplatePrefix(ol,scopedContainer,tal,false);
3726 }
3727 }
3728 }
3729 if (m_tArgList.hasParameters() && lang==SrcLangExt::Cpp) // function template prefix
3730 {
3732 _writeTemplatePrefix(ol,scopedContainer,m_tArgList);
3734 }
3735 }
3736
3737 if (!sl.empty())
3738 {
3739 ol.pushGeneratorState();
3740 ol.disableAll();
3742 ol.writeString("<table class=\"mlabels\">\n");
3743 ol.writeString(" <tr>\n");
3744 ol.writeString(" <td class=\"mlabels-left\">\n");
3745 ol.popGeneratorState();
3746 htmlEndLabelTable=true;
3747 }
3748
3750 if (cd && cd->isObjectiveC())
3751 {
3752 // strip scope name
3753 if (size_t ep = ldef.find("::"); ep!=DString::npos)
3754 {
3755 if (size_t sp=ldef.rfind(' ',ep); sp!=DString::npos)
3756 {
3757 ldef=ldef.left(sp+1)+ldef.mid(ep+2);
3758 } else {
3759 ldef=ldef.mid(ep+2);
3760 }
3761 }
3762 // strip keywords
3763 if (size_t dp = ldef.find(':'); dp!=DString::npos)
3764 {
3765 ldef=ldef.left(dp+1);
3766 }
3767 int dl=static_cast<int>(ldef.length());
3768 //printf("start >%s<\n",qPrint(ldef));
3769 int i=dl-1;
3770 while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
3771 while (i>=0 && isspace(static_cast<uint8_t>(ldef.at(i)))) i--;
3772 if (i>0)
3773 {
3774 // insert branches around the type
3775 ldef="("+ldef.left(i+1)+")"+ldef.mid(i+1);
3776 }
3777 //printf("end >%s< i=%d\n",qPrint(ldef),i);
3778 if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
3779 }
3780
3781 if (optVhdl)
3782 {
3783 hasParameterList=VhdlDocGen::writeVHDLTypeDocumentation(this,scopedContainer,ol);
3784 }
3785 else if (lang==SrcLangExt::Slice)
3786 {
3787 // Eliminate the self-reference.
3788 size_t pos = ldef.rfind(' ');
3789 if (pos==DString::npos) pos=0;
3790 if (pos>0)
3791 {
3792 linkifyText(TextGeneratorOLImpl(ol),ldef.left(pos),options);
3793 }
3794 ol.docify(ldef.mid(pos));
3795 const Definition *scope = cd;
3796 if (scope==nullptr) scope = nd;
3797 hasParameterList=writeDefArgumentList(ol,scope,this);
3798 }
3799 else
3800 {
3801 linkifyText(TextGeneratorOLImpl(ol),substitute(ldef,"::",sep),options);
3802 const Definition *scope = cd;
3803 if (scope==nullptr) scope = nd;
3804 hasParameterList=writeDefArgumentList(ol,scope,this);
3805 }
3806
3807 if (hasOneLineInitializer()) // add initializer
3808 {
3809 if (isTypeAlias())
3810 {
3811 ol.docify(" = ");
3814 }
3815 else if (!isDefine())
3816 {
3817 ol.docify(" ");
3820 }
3821 else
3822 {
3825 }
3826 }
3827 if (!excpString().empty()) // add exception list
3828 {
3829 writeExceptionList(ol,cd,this);
3830 hasParameterList=true; // call endParameterList below
3831 }
3832 }
3833
3834 ol.pushGeneratorState();
3836 if (!sl.empty())
3837 {
3838 ol.startLabels();
3839 size_t count=0;
3840 for (const auto &s : sl)
3841 {
3842 count++;
3843 ol.writeLabel(s,count==sl.size());
3844 }
3845 ol.endLabels();
3846 }
3847 ol.popGeneratorState();
3848
3849 if (hasParameterList)
3850 {
3851 ol.endParameterList();
3852 ol.endMemberDoc(true);
3853 }
3854 else
3855 {
3856 ol.endMemberDocName();
3857 ol.endMemberDoc(false);
3858 }
3859
3860 // for HTML write the labels here
3861 ol.pushGeneratorState();
3862 ol.disableAll();
3864 if (htmlEndLabelTable)
3865 {
3866 ol.writeString(" </td>\n");
3867 ol.writeString(" <td class=\"mlabels-right\">\n");
3868 ol.startLabels();
3869 size_t count=0;
3870 for (const auto &s : sl)
3871 {
3872 count++;
3873 ol.writeLabel(s,count==sl.size());
3874 }
3875 ol.endLabels();
3876 ol.writeString(" </td>\n");
3877 ol.writeString(" </tr>\n");
3878 ol.writeString("</table>\n");
3879 }
3880 ol.writeString("</div>");
3881 ol.popGeneratorState();
3882
3883
3884 ol.endDoxyAnchor(cfname,memAnchor);
3885 ol.startIndent();
3886
3887 _writeGroupInclude(ol,inGroup);
3888
3889 /* write multi-line initializer (if any) */
3891
3892 /* write brief description */
3893 DString brief = briefDescription();
3894 if (!brief.empty() &&
3895 (Config_getBool(REPEAT_BRIEF) ||
3896 !Config_getBool(BRIEF_MEMBER_DESC)
3897 )
3898 )
3899 {
3900 ol.startParagraph();
3902 briefLine(),
3903 scopedContainer,
3904 this,
3905 brief,
3906 DocOptions()
3907 .setSingleLine(true));
3908 ol.endParagraph();
3909 }
3910
3911 /* write detailed description */
3912 DString detailed = documentation();
3913 if (!detailed.empty() ||
3914 !inbodyDocumentation().empty())
3915 {
3916 // write vhdl inline code with or without option INLINE_SOURCE
3917 if (optVhdl && VhdlDocGen::isMisc(this))
3918 {
3919 VhdlDocGen::writeSource(this,ol,cname);
3920 return;
3921 }
3922 else
3923 {
3924 ol.generateDoc(docFile(),
3925 docLine(),
3926 scopedContainer,
3927 this,
3928 detailed+"\n",
3929 DocOptions()
3930 .setIndexWords(true));
3931 }
3932
3933 if (!inbodyDocumentation().empty())
3934 {
3936 inbodyLine(),
3937 scopedContainer,
3938 this,
3939 inbodyDocumentation()+"\n",
3940 DocOptions()
3941 .setIndexWords(true));
3942 }
3943 }
3944 else if (!brief.empty() && (Config_getBool(REPEAT_BRIEF) || !Config_getBool(BRIEF_MEMBER_DESC)))
3945 {
3946 if (!inbodyDocumentation().empty())
3947 {
3949 inbodyLine(),
3950 scopedContainer,
3951 this,
3952 inbodyDocumentation()+"\n",
3953 DocOptions()
3954 .setIndexWords(true));
3955 }
3956 }
3957
3958
3959 //printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n",
3960 // defArgList,
3961 // defArgList?defArgList->hasDocumentation():-1);
3962 const ArgumentList &docArgList = m_templateMaster ?
3965 ol.generateDoc(docFile(),
3966 docLine(),
3967 scopedContainer,
3968 this, // memberDef
3969 inlineArgListToDoc(docArgList), // docStr
3970 DocOptions()
3971 .setIndexWords(true));
3972
3973 const ArgumentList &docTemplateArgList = m_templateMaster ?
3975 m_tArgList;
3976 ol.generateDoc(docFile(),
3977 docLine(),
3978 scopedContainer,
3979 this, // memberDef
3980 inlineTemplateArgListToDoc(docTemplateArgList), // docStr
3981 DocOptions()
3982 .setIndexWords(true));
3983
3984 _writeEnumValues(ol,scopedContainer,cfname,ciname,cname);
3988 _writeExamples(ol);
3990 DString scopeStr = getScopeString();
3991 writeSourceDef(ol);
3992 writeInlineCode(ol,scopeStr);
3993 if (hasReferencesRelation()) writeSourceRefs(ol,scopeStr);
3994 if (hasReferencedByRelation()) writeSourceReffedBy(ol,scopeStr);
3995 _writeCallGraph(ol);
3998
3999 ol.endIndent();
4000
4001 // enable LaTeX again
4002 //if (Config_getBool(EXTRACT_ALL) && !hasDocs) ol.enable(OutputType::Latex);
4003 ol.popGeneratorState();
4004
4006}
4007
4008// strip scope and field name from the type
4009// example: "struct N<K::J>::S.v.c" will become "struct v"
4011{
4013 if (ts.endsWith("::")) ts = ts.left(ts.length()-2);
4014 static const reg::Ex re1(R"(\a\w*::)"); // non-template version
4015 static const reg::Ex re2(R"(\a\w*<[^>]*>::)"); // template version
4016 reg::Match match;
4017 std::string t = ts.str();
4018 while (reg::search(t,match,re2) || reg::search(t,match,re1))
4019 {
4020 t = match.prefix().str() + match.suffix().str(); // remove the matched part
4021 }
4022 //printf("simplifyTypeForTable(%s)->%s\n",qPrint(s),qPrint(t));
4023 return t;
4024}
4025
4027{
4028 DString type = m_type;
4029 if (isTypedef() && getLanguage() != SrcLangExt::Slice) type.prepend("typedef ");
4030 return simplifyTypeForTable(type);
4031}
4032
4034{
4035 Definition *scope = getOuterScope();
4036 DString doxyName = name();
4037 DString doxyArgs = argsString();
4038 DString memAnchor = anchor();
4039 DString cfname = getOutputFileBase();
4040 DString cname;
4041 if (scope) cname = scope->name();
4042 if (doxyName.at(0)=='@')
4043 {
4044 doxyName="__unnamed__";
4045 }
4046
4047 LinkifyTextOptions options;
4048 options.setScope(scope).setFileScope(getBodyDef()).setSelf(this);
4049
4050 if (container && container->definitionType()==Definition::TypeClass &&
4051 !(toClassDef(container))->isJavaEnum())
4052 {
4054 ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
4055 ol.addLabel(cfname,memAnchor);
4056
4057 bool written=false;
4058 const ClassDef *annoClassDef=getClassDefOfAnonymousType();
4059 if (annoClassDef)
4060 {
4061 static const reg::Ex ar(R"([\w@:]*@\d+[\w@:]*)"); // anonymous type marker(s) including scope
4062 reg::Match amatch;
4063 std::string stype = m_type.str();
4064 if (reg::search(stype,amatch,ar))
4065 {
4066 size_t ai = amatch.position();
4067 size_t al = amatch.length();
4068 ol.writeObjectLink(annoClassDef->getReference(),annoClassDef->getOutputFileBase(),
4069 annoClassDef->anchor(),m_type.left(ai)+m_type.mid(ai+al));
4070 written=true;
4071 }
4072 }
4073 if (!written)
4074 {
4075 DString ts;
4076 if (isFunctionPtr())
4077 {
4078 ts = m_type + m_args;
4079 }
4080 else
4081 {
4082 ts = fieldType();
4083 }
4084 linkifyText(TextGeneratorOLImpl(ol),ts,options);
4085 }
4086 ol.endDoxyAnchor(cfname,memAnchor);
4088 }
4089
4091 ol.docify(doxyName);
4092 if (isVariable() && !argsString().empty() && !isObjCMethod() && !isFunctionPtr())
4093 {
4095 }
4096 if (!m_bitfields.empty()) // add bitfields
4097 {
4099 }
4100 if (hasOneLineInitializer() && !isDefine())
4101 {
4102 ol.writeString(" ");
4104 }
4106
4108
4109 DString brief = briefDescription();
4110 DString detailed = documentation();
4111
4112 /* write brief description */
4113 if (!brief.empty())
4114 {
4116 briefLine(),
4117 getOuterScope()?getOuterScope():container,this,
4118 brief,
4119 DocOptions()
4120 .setSingleLine(true));
4121 }
4122
4123 /* write detailed description */
4124 if (!detailed.empty())
4125 {
4126 if (!brief.empty())
4127 {
4129 ol.lineBreak();
4131 }
4132 ol.generateDoc(docFile(),
4133 docLine(),
4134 getOuterScope()?getOuterScope():container,this,
4135 detailed+"\n",
4136 DocOptions());
4137 }
4138
4139 ol.endInlineMemberDoc();
4140}
4141
4143{
4144 if (m_mtype == MemberType::Define)
4145 {
4146 return "macro definition";
4147 }
4148 else if (m_mtype == MemberType::Enumeration)
4149 {
4150 return "enumeration";
4151 }
4152 return to_string_lower(m_mtype);
4153}
4154
4156{
4157 /*
4158 * Removed bug_303020:
4159 * if (m_memberGroup) return;
4160 */
4161 const ClassDef *cd = getClassDef();
4162 const NamespaceDef *nd = getNamespaceDef();
4163 const FileDef *fd = getFileDef();
4164 const GroupDef *gd = getGroupDef();
4165 const Definition *d=nullptr;
4166 DString t;
4167 if (cd)
4168 {
4169 t=cd->compoundTypeString();
4170 d=cd;
4171 }
4172 else if (nd)
4173 {
4174 t=nd->compoundTypeString();
4175 d=nd;
4176 }
4177 else if (gd)
4178 {
4179 t="group";
4180 d=gd;
4181 }
4182 else
4183 {
4184 t="file";
4185 d=fd;
4186 }
4187 bool extractAll = Config_getBool(EXTRACT_ALL);
4188
4189 //printf("%s:warnIfUndoc: hasUserDocs=%d isFriendClass=%d protection=%d isRef=%d isDel=%d\n",
4190 // qPrint(name()),
4191 // hasUserDocumentation(),isFriendClass(),protectionLevelVisible(m_prot),isReference(),isDeleted());
4192 if ((!hasUserDocumentation() && !extractAll) &&
4193 !isFriendClass() &&
4194 name().find('@')==DString::npos && d && d->name().find('@')==DString::npos &&
4197 !isReference() && !isDeleted()
4198 )
4199 {
4200 SrcLangExt lang = getLanguage();
4201 DString sep = getLanguageSpecificSeparator(lang,true);
4202 warn_undoc(getDefFileName(),getDefLine(),"Member {}{} ({}) of {} {} is not documented.",
4204 substitute(d->name(),"::",sep));
4205 }
4206 else if (!hasDetailedDescription())
4207 {
4209 }
4210
4211 // if it is an enum, we check that its members are documented
4212 if (!extractAll && isEnumerate() && Config_getBool(WARN_IF_UNDOC_ENUM_VAL))
4213 {
4214 for (const auto &fmd : enumFieldList())
4215 {
4216 if (!fmd->isLinkableInProject())
4217 {
4218 SrcLangExt lang = getLanguage();
4219 DString sep = getLanguageSpecificSeparator(lang,true);
4220 warn(fmd->getDefFileName(),fmd->getDefLine(), "Documentation for enum member '{}{}{}' is missing.",
4221 qualifiedName(),sep,fmd->name());
4222 }
4223 }
4224 }
4225}
4226
4228{
4229 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
4230 bool extractStatic = Config_getBool(EXTRACT_STATIC);
4231 return (!isAnonymous() &&
4232 (!hideUndocMembers || hasDocumentation()) &&
4233 (!isStatic() || extractStatic) &&
4234 isLinkable()
4235 );
4236}
4237
4238static DString stripTrailingReturn(const DString &trailRet)
4239{
4240 DString ret = trailRet;
4241
4242 ret = ret.stripWhiteSpace();
4243 if (ret.startsWith("->"))
4244 {
4245 ret = ret.mid(2).stripWhiteSpace();
4246 return ret;
4247 }
4248 return trailRet;
4249}
4250
4252
4253void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const
4254{
4255 //printf("%s:detectUndocumentedParams(%d,%d)\n",qPrint(name()),hasParamCommand,hasReturnCommand);
4256 bool isPython = getLanguage()==SrcLangExt::Python;
4257
4258 // this function is called while parsing the documentation. A member can have multiple
4259 // documentation blocks, which could be handled by multiple threads, hence this guard.
4260 std::lock_guard<std::mutex> lock(g_detectUndocumentedParamsMutex);
4261
4262 if (!m_hasDocumentedParams && hasParamCommand)
4263 {
4264 //printf("%s:hasDocumentedParams=true;\n",qPrint(name()));
4265 m_hasDocumentedParams = true;
4266 }
4267 else if (!m_hasDocumentedParams)
4268 {
4269 const ArgumentList &al = argumentList();
4270 const ArgumentList &declAl = declArgumentList();
4271 bool allDoc=true; // no parameter => all parameters are documented
4272 if ( // member has parameters
4273 al.hasParameters() // with at least one parameter (that is not void)
4274 )
4275 {
4276 // see if all parameters have documentation
4277 for (auto it = al.begin(); it!=al.end() && allDoc; ++it)
4278 {
4279 const Argument &a = *it;
4280 if (!a.name.empty() && a.type!="void" && a.name!="..." &&
4281 !(isPython && (a.name=="self" || a.name=="cls"))
4282 )
4283 {
4284 allDoc = !a.docs.empty();
4285 }
4286 //printf("a.type=%s a.name=%s doc=%s\n",
4287 // qPrint(a.type),qPrint(a.name),qPrint(a.docs));
4288 }
4289 if (!allDoc && declAl.empty()) // try declaration arguments as well
4290 {
4291 allDoc=true;
4292 for (auto it = al.begin(); it!=al.end() && allDoc; ++it)
4293 {
4294 const Argument &a = *it;
4295 if (!a.name.empty() && a.type!="void" && a.name!="..." &&
4296 !(isPython && (a.name=="self" || a.name=="cls"))
4297 )
4298 {
4299 allDoc = !a.docs.empty();
4300 }
4301 //printf("a.name=%s doc=%s\n",qPrint(a.name),qPrint(a.docs));
4302 }
4303 }
4304 }
4305 if (allDoc)
4306 {
4307 //printf("%s:hasDocumentedParams=true;\n",qPrint(name()));
4308 m_hasDocumentedParams = true;
4309 }
4310 }
4311
4312 //printf("Member %s hasDocumentedReturnType=%d hasReturnCommand=%d\n",
4313 // qPrint(name()),m_hasDocumentedReturnType,hasReturnCommand);
4315}
4316
4318{
4319 DString returnType = typeString();
4320 bool isFortran = getLanguage()==SrcLangExt::Fortran;
4321 bool isFortranSubroutine = isFortran && returnType.find("subroutine")!=DString::npos;
4322
4323 bool isVoidReturn = returnType=="void" || returnType.endsWith(" void");
4324 if (!isVoidReturn && (returnType=="auto" || returnType.endsWith(" auto")))
4325 {
4327 if (!defArgList.trailingReturnType().empty())
4328 {
4329 DString strippedTrailingReturn = stripTrailingReturn(defArgList.trailingReturnType());
4330 isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.endsWith(" void"));
4331 }
4332 }
4333 if (!Config_getBool(EXTRACT_ALL) &&
4334 Config_getBool(WARN_IF_UNDOCUMENTED) &&
4335 Config_getBool(WARN_NO_PARAMDOC) &&
4336 isFunction() &&
4337 !isDeleted() &&
4338 !isReference() &&
4340 {
4342 {
4344 "parameters of member {} are not documented",
4345 qualifiedName());
4346 }
4348 hasDocumentation() && !returnType.empty() &&
4349 !( // not one of the cases where nothing is returned
4350 isVoidReturn || // void return type
4351 isFortranSubroutine || // fortran subroutine
4352 isConstructor() || // a constructor
4353 isDestructor() || // or a destructor
4354 isFriend() // or a friend
4355 )
4356 )
4357 {
4359 "return type of member {} is not documented",
4360 qualifiedName());
4361 }
4362 }
4363 if (Config_getBool(WARN_IF_DOC_ERROR) &&
4365 (isVoidReturn || // void return type
4366 isFortranSubroutine || // fortran subroutine
4367 isConstructor() || // a constructor
4368 isDestructor())) // or destructor
4369 {
4370 warn_doc_error(docFile(),docLine(),"found documented return type for {} that does not return anything",
4371 qualifiedName());
4372 }
4373}
4374
4376{
4377 ClassDef *fcd=nullptr;
4378 DString baseName=name();
4379 if (size_t i=baseName.find('<'); i!=DString::npos) baseName=baseName.left(i);
4380 return (isFriendClass() &&
4381 (fcd=getClass(baseName)) && fcd->isLinkable());
4382}
4383
4385{
4386 return m_defArgList.isDeleted();
4387}
4388
4390{
4392 (m_mtype==MemberType::Enumeration && m_docEnumValues) || // has enum values
4393 (m_defArgList.hasDocumentation()|| m_tArgList.hasTemplateDocumentation()); // has doc (template) arguments
4394}
4395
4396
4401
4403{
4404 DString result;
4405 if (isStrong()) result=name();
4406 else if (getClassDef()) result=getClassDef()->displayName();
4407 else if (getNamespaceDef()) result=getNamespaceDef()->displayName();
4408 return result;
4409}
4410
4412{
4413 DString memAnchor = name();
4414 if (!m_args.empty()) memAnchor+=m_args;
4415 if (m_memSpec.isAlias()) // this is for backward compatibility
4416 {
4417 memAnchor.prepend(" = "+m_initializer);
4418 }
4419 memAnchor.prepend(definition()); // actually the method name is now included
4420 // twice, which is silly, but we keep it this way for backward
4421 // compatibility.
4422
4423 // include number of template arguments as well,
4424 // to distinguish between two template
4425 // specializations that only differ in the template parameters.
4427 {
4428 char buf[20];
4429 snprintf(buf,20,"%d:",static_cast<int>(m_tArgList.size()));
4430 buf[19]='\0';
4431 memAnchor.prepend(buf);
4432 }
4433 if (!m_requiresClause.empty())
4434 {
4435 memAnchor+=" "+m_requiresClause;
4436 }
4437 if (m_redefineCount>0)
4438 {
4439 char buf[20];
4440 snprintf(buf,20,":%d",m_redefineCount);
4441 buf[19]='\0';
4442 memAnchor.append(buf);
4443 }
4444
4445 // convert to md5 hash
4446 m_anc = "a"+md5str(memAnchor.view());
4447}
4448
4450 const DString &fileName,int startLine,
4451 bool hasDocs,MemberDef *member)
4452{
4453 //printf("%s MemberDefImpl::setGroupDef(%s)\n",qPrint(name()),qPrint(gd->name()));
4454 m_group=gd;
4455 m_grouppri=pri;
4456 m_groupFileName=fileName;
4457 m_groupStartLine=startLine;
4458 m_groupHasDocs=hasDocs;
4459 m_groupMember=member;
4461}
4462
4477
4485
4487{
4488 m_nspace=nd;
4489 setOuterScope(nd);
4490}
4491
4493 const ArgumentList &formalArgs,const std::unique_ptr<ArgumentList> &actualArgs) const
4494{
4495 //printf(" Member %s %s %s\n",qPrint(typeString()),qPrint(name()),qPrint(argsString()));
4496 std::unique_ptr<ArgumentList> actualArgList = std::make_unique<ArgumentList>(m_defArgList);
4497 if (!m_defArgList.empty())
4498 {
4499 // replace formal arguments with actuals
4500 for (Argument &arg : *actualArgList)
4501 {
4502 arg.type = substituteTemplateArgumentsInString(arg.type,formalArgs,actualArgs.get());
4503 }
4504 actualArgList->setTrailingReturnType(
4505 substituteTemplateArgumentsInString(actualArgList->trailingReturnType(),formalArgs,actualArgs.get()));
4506 }
4507
4508 DString methodName=name();
4509 if (methodName.startsWith("operator ")) // conversion operator
4510 {
4511 methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs.get());
4512 }
4513
4514 auto imd = createMemberDef(
4516 substituteTemplateArgumentsInString(m_type,formalArgs,actualArgs.get()),
4517 methodName,
4518 substituteTemplateArgumentsInString(m_args,formalArgs,actualArgs.get()),
4521 ArgumentList(), ArgumentList(), ""
4522 );
4523 auto mmd = toMemberDefMutable(imd.get());
4524 mmd->moveArgumentList(std::move(actualArgList));
4525 mmd->setDefinition(substituteTemplateArgumentsInString(m_def,formalArgs,actualArgs.get()));
4526 mmd->setBodyDef(getBodyDef());
4527 mmd->setBodySegment(getDefLine(),getStartBodyLine(),getEndBodyLine());
4528 mmd->setFormalTemplateArguments(formalArgs);
4529
4530 // TODO: init other member variables (if needed).
4531 // TODO: reimplemented info
4532 return imd;
4533}
4534
4536{
4537 //printf("%s: init=%s, initLines=%d maxInitLines=%d userInitLines=%d\n",
4538 // qPrint(name()),qPrint(m_initializer),m_initLines,
4539 // m_maxInitLines,m_userInitLines);
4540 bool isFuncLikeMacro = m_mtype==MemberType::Define && m_defArgList.hasParameters();
4541 return !m_initializer.empty() && m_initLines==0 && // one line initializer
4542 !isFuncLikeMacro &&
4543 ((m_maxInitLines>0 && m_userInitLines==-1) || m_userInitLines>0); // enabled by default or explicitly
4544}
4545
4547{
4548 //printf("initLines=%d userInitLines=%d maxInitLines=%d\n",
4549 // initLines,userInitLines,maxInitLines);
4550 bool isFuncLikeMacro = m_mtype==MemberType::Define && m_defArgList.hasParameters();
4551 return (m_initLines>0 || (!m_initializer.empty() && isFuncLikeMacro)) &&
4552 ((m_initLines<m_maxInitLines && m_userInitLines==-1) // implicitly enabled
4553 || m_initLines<m_userInitLines // explicitly enabled
4554 );
4555}
4556
4558{
4559 size_t indent=0;
4561 int l=static_cast<int>(m_initializer.length());
4562 int p=l-1;
4563 while (p>=0 && isspace(static_cast<uint8_t>(m_initializer.at(p)))) p--;
4567
4568 //printf("%s::setInitializer(%s)\n",qPrint(name()),qPrint(m_initializer));
4569}
4570
4572{
4573 bool optimizeOutputForC = Config_getBool(OPTIMIZE_OUTPUT_FOR_C);
4574 SrcLangExt lang = getLanguage();
4575 if (!isLinkableInProject()) return;
4576 DString memLabel;
4577 if (optimizeOutputForC)
4578 {
4579 memLabel=theTranslator->trGlobal(true,true);
4580 }
4581 else if (lang==SrcLangExt::Fortran)
4582 {
4583 memLabel=theTranslator->trSubprogram(true,true);
4584 }
4585 else
4586 {
4587 memLabel=theTranslator->trMember(true,true);
4588 }
4589 DString memName = name();
4592 (toClassDef(pd))->displayName() : pd->name();
4593 DString sep = getLanguageSpecificSeparator(lang,true);
4594 DString memArgs;
4595 if (!isRelated())
4596 {
4597 if (isObjCMethod())
4598 {
4599 memName = "[" + pd->name() + " " + name() + "]";
4600 }
4601 else
4602 {
4603 if (pd!=Doxygen::globalScope) memName.prepend(pdName+sep);
4604 memArgs = argsString();
4605 }
4606 }
4607 const RefItemVector &xrefItems = xrefListItems();
4608 if (sep!="::")
4609 {
4610 memName = substitute(memName,"::",sep);
4611 }
4612 addRefItem(xrefItems,
4613 qualifiedName()+argsString(), // argsString is needed for overloaded functions (see bug 609624)
4614 memLabel,
4615 getOutputFileBase()+"#"+anchor(),memName,memArgs,pd);
4616}
4617
4622
4624{
4625 auto it = m_sectionMap.find(container);
4626 return it!=m_sectionMap.end() ? it->second : nullptr;
4627}
4628
4630{
4631 //printf("MemberDefImpl::setSectionList(%s,%p) name=%s\n",qPrint(d->name()),sl,qPrint(name()));
4632 m_sectionMap.emplace(container,sl);
4633}
4634
4636{
4637 if (count>25)
4638 {
4640 "Internal inconsistency: recursion detected in overload relation for member {}!",name());
4641 return Specifier::Normal;
4642 }
4643 Specifier v = m_virt;
4644 const MemberDef *rmd = reimplements();
4645 while (rmd && v==Specifier::Normal)
4646 {
4647 v = rmd->virtualness(count+1)==Specifier::Normal ? Specifier::Normal : Specifier::Virtual;
4648 rmd = rmd->reimplements();
4649 }
4650 return v;
4651}
4652
4653void MemberDefImpl::writeTagFile(TextStream &tagFile,bool useQualifiedName,bool showNamespaceMembers) const
4654{
4655 if (!isLinkableInProject()) return;
4656 if (!showNamespaceMembers && getNamespaceDef()) return;
4657 tagFile << " <member kind=\"";
4658 if (m_mtype == MemberType::Enumeration)
4659 {
4660 tagFile << "enumeration";
4661 }
4662 else
4663 {
4664 tagFile << to_string_lower(m_mtype);
4665 }
4666 if (m_prot!=Protection::Public)
4667 {
4668 tagFile << "\" protection=\"";
4669 if (m_prot==Protection::Protected) tagFile << "protected";
4670 else if (m_prot==Protection::Package) tagFile << "package";
4671 else /* Private */ tagFile << "private";
4672 }
4673 if (m_virt!=Specifier::Normal)
4674 {
4675 tagFile << "\" virtualness=\"";
4676 if (m_virt==Specifier::Virtual) tagFile << "virtual";
4677 else /* Pure */ tagFile << "pure";
4678 }
4679 if (isStatic())
4680 {
4681 tagFile << "\" static=\"yes";
4682 }
4683 tagFile << "\">\n";
4684 if (typeString()!=DString("@"))
4685 {
4686 tagFile << " <type>" << convertToXML(typeString()) << "</type>\n";
4687 }
4690 tagFile << " <name>" << convertToXML(useQualifiedName ? qualifiedName() : name()) << "</name>\n";
4691 tagFile << " <anchorfile>" << convertToXML(fn) << "</anchorfile>\n";
4692 tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>\n";
4693 DString idStr = id();
4694 if (!idStr.empty())
4695 {
4696 tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>\n";
4697 }
4698 tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>\n";
4699 if (isStrong())
4700 {
4701 for (const auto &fmd : m_enumFields)
4702 {
4703 if (!fmd->isReference())
4704 {
4705 tagFile << " <enumvalue file=\"" << convertToXML(fn);
4706 tagFile << "\" anchor=\"" << convertToXML(fmd->anchor());
4707 idStr = fmd->id();
4708 if (!idStr.empty())
4709 {
4710 tagFile << "\" clangid=\"" << convertToXML(idStr);
4711 }
4712 tagFile << "\">" << convertToXML(fmd->name()) << "</enumvalue>\n";
4713 }
4714 }
4715 }
4716 writeDocAnchorsToTagFile(tagFile);
4717 tagFile << " </member>\n";
4718}
4719
4721{
4722 m_isConstructorCached=1; // false
4723 if (getClassDef())
4724 {
4725 if (m_isDMember) // for D
4726 {
4727 m_isConstructorCached = name()=="this" ? 2 : 1;
4728 return;
4729 }
4730 else if (getLanguage()==SrcLangExt::PHP) // for PHP
4731 {
4732 m_isConstructorCached = name()=="__construct" ? 2 : 1;
4733 return;
4734 }
4735 else if (name()=="__init__" &&
4736 getLanguage()==SrcLangExt::Python) // for Python
4737 {
4738 m_isConstructorCached = 2; // true
4739 return;
4740 }
4741 else // for other languages
4742 {
4743 DString locName = getClassDef()->localName();
4744 size_t i=locName.find('<');
4745 if (i==DString::npos) // not a template class
4746 {
4747 m_isConstructorCached = name()==locName ? 2 : 1;
4748 }
4749 else
4750 {
4751 m_isConstructorCached = name()==locName.left(i) ? 2 : 1;
4752 }
4753 return;
4754 }
4755 }
4756}
4757
4759{
4760 if (m_isConstructorCached==0)
4761 {
4762 MemberDefImpl *that = const_cast<MemberDefImpl*>(this);
4763 that->_computeIsConstructor();
4764 }
4766 return m_isConstructorCached==2;
4767
4768}
4769
4771{
4772 bool isDestructor = false;
4773 if (m_isDMember) // for D
4774 {
4775 isDestructor = name()=="~this";
4776 }
4777 else if (getLanguage()==SrcLangExt::PHP) // for PHP
4778 {
4779 isDestructor = name()=="__destruct";
4780 }
4781 else if (name()=="__del__" &&
4782 getLanguage()==SrcLangExt::Python) // for Python
4783 {
4784 isDestructor = true;
4785 }
4786 else if (getLanguage()==SrcLangExt::Fortran) // for Fortran
4787 {
4788 isDestructor = typeString()=="final";
4789 }
4790 else // other languages
4791 {
4792 isDestructor =
4793 (name().find('~')!=DString::npos || name().find('!')!=DString::npos) // The ! is for C++/CLI
4794 && name().find("operator")==DString::npos;
4795 }
4797}
4798
4800{
4801 if (m_isDestructorCached==0)
4802 {
4803 MemberDefImpl *that=const_cast<MemberDefImpl*>(this);
4804 that->_computeIsDestructor();
4805 }
4807 return m_isDestructorCached==2;
4808}
4809
4811 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod) const
4812{
4813 int enumMemCount=0;
4814
4815 uint32_t numVisibleEnumValues=0;
4816 for (const auto &fmd : m_enumFields)
4817 {
4818 if (fmd->isBriefSectionVisible()) numVisibleEnumValues++;
4819 }
4820 if (numVisibleEnumValues==0 && !isBriefSectionVisible())
4821 {
4822 return;
4823 }
4824
4825 DString n = name();
4826 if (size_t i=n.rfind("::"); i!=DString::npos) n=n.mid(i+2); // strip scope (TODO: is this needed?)
4827 if (n[0]!='@') // not an anonymous enum
4828 {
4830 {
4831 //_writeTagData(compoundType);
4832 writeLink(typeDecl,cd,nd,fd,gd,mod);
4833 }
4834 else
4835 {
4836 typeDecl.startBold();
4837 typeDecl.docify(n);
4838 typeDecl.endBold();
4839 }
4840 typeDecl.writeChar(' ');
4841 }
4842 if (!m_enumBaseType.empty())
4843 {
4844 typeDecl.writeChar(':');
4845 typeDecl.writeChar(' ');
4846 typeDecl.docify(m_enumBaseType);
4847 typeDecl.writeChar(' ');
4848 }
4849
4850 uint32_t enumValuesPerLine = static_cast<uint32_t>(Config_getInt(ENUM_VALUES_PER_LINE));
4851 if (numVisibleEnumValues>0 && enumValuesPerLine>0)
4852 {
4853 typeDecl.docify("{ ");
4854
4855 auto it = m_enumFields.begin();
4856 if (it!=m_enumFields.end())
4857 {
4858 const MemberDef *fmd=*it;
4859 bool fmdVisible = fmd->isBriefSectionVisible();
4860 bool first=true;
4861 while (fmd)
4862 {
4863 if (fmdVisible)
4864 {
4865 if (!first)
4866 {
4867 typeDecl.writeString(", ");
4868 }
4869 /* in html we start a new line after a number of items */
4870 if (numVisibleEnumValues>enumValuesPerLine
4871 && (enumMemCount%enumValuesPerLine)==0
4872 )
4873 {
4874 typeDecl.pushGeneratorState();
4876 typeDecl.enable(OutputType::Latex);
4877 typeDecl.enable(OutputType::Docbook);
4878 typeDecl.lineBreak();
4879 typeDecl.disable(OutputType::Latex);
4880 typeDecl.disable(OutputType::Docbook);
4881 typeDecl.writeString("&#160;&#160;");
4882 typeDecl.popGeneratorState();
4883 }
4884
4885 if (fmd->hasDocumentation()) // enum value has docs
4886 {
4887 fmd->writeLink(typeDecl,cd,nd,fd,gd,mod);
4888 }
4889 else // no docs for this enum value
4890 {
4891 typeDecl.startBold();
4892 typeDecl.docify(fmd->name());
4893 typeDecl.endBold();
4894 }
4895 if (fmd->hasOneLineInitializer()) // enum value has initializer
4896 {
4897 //typeDecl.writeString(" = ");
4898 typeDecl.writeString(" ");
4899 typeDecl.parseText(fmd->initializer());
4900 }
4901 first=false;
4902 }
4903
4904 bool prevVisible = fmdVisible;
4905 ++it;
4906 if (it!=m_enumFields.end())
4907 {
4908 fmd=*it;
4909 }
4910 else
4911 {
4912 fmd=nullptr;
4913 }
4914 if (prevVisible)
4915 {
4916 typeDecl.disable(OutputType::Man);
4917 typeDecl.writeString("\n"); // to prevent too long lines in LaTeX
4918 typeDecl.enable(OutputType::Man);
4919 enumMemCount++;
4920 }
4921 }
4922 if (numVisibleEnumValues>enumValuesPerLine)
4923 {
4924 typeDecl.pushGeneratorState();
4926 typeDecl.lineBreak();
4927 typeDecl.popGeneratorState();
4928 }
4929 }
4930 typeDecl.docify(" }");
4931 }
4932}
4933
4934void MemberDefImpl::moveArgumentList(std::unique_ptr<ArgumentList> al)
4935{
4936 m_defArgList = *al;
4937}
4938
4939void MemberDefImpl::moveDeclArgumentList(std::unique_ptr<ArgumentList> al)
4940{
4941 m_declArgList = *al;
4942}
4943
4948
4950{
4951 m_type = t;
4952}
4953
4960
4962{
4964 if (e) Doxygen::parseSourcesNeeded = true;
4965}
4966
4968{
4970 if (e) Doxygen::parseSourcesNeeded = true;
4971}
4972
4978
4984
4989
4994
4996{
4997 if (getClassDef() && getClassDef()->isObjectiveC() && isFunction()) return true;
4998 return false;
4999}
5000
5002{
5003 if (getClassDef() && getClassDef()->isObjectiveC() && isProperty()) return true;
5004 return false;
5005}
5006
5008{
5009 if (getClassDef() && getClassDef()->isCSharp() && isProperty()) return true;
5010 return false;
5011}
5012
5014{
5015 if (isObjCMethod())
5016 {
5017 DString qm;
5018 if (isStatic()) qm="+"; else qm="-";
5019 qm+="[";
5020 qm+=getClassDef()->name()+" ";
5021 qm+=name();
5022 qm+="]";
5023 return qm;
5024 }
5025 else if (m_enumScope && m_enumScope->isStrong())
5026 {
5027 return m_enumScope->qualifiedName()+
5029 localName();
5030 }
5031 else
5032 {
5034 }
5035}
5036
5038{
5039 if (ti)
5040 {
5041 //printf("%s: Setting tag name=%s anchor=%s\n",qPrint(name()),qPrint(ti->tagName),qPrint(ti->anchor));
5042 m_anc=ti->anchor;
5043 setReference(ti->tagName);
5045 }
5046}
5047
5048DString MemberDefImpl::objCMethodName(bool localLink,bool showStatic) const
5049{
5050 DString qm;
5051 if (showStatic)
5052 {
5053 if (isStatic()) qm="+ "; else qm="- ";
5054 }
5055 qm+=name();
5056 if (!localLink) // link to method of same class
5057 {
5058 qm+=" (";
5059 qm+=getClassDef()->name();
5060 qm+=")";
5061 }
5062 return qm;
5063}
5064
5066{
5067 return m_decl;
5068}
5069
5071{
5072 return m_def;
5073}
5074
5079
5081{
5082 return m_type;
5083}
5084
5086{
5087 return m_args;
5088}
5089
5091{
5092 return m_exception;
5093}
5094
5096{
5097 return m_bitfields;
5098}
5099
5101{
5102 return m_initializer;
5103}
5104
5106{
5107 return m_initLines;
5108}
5109
5111{
5112 return m_docTransferDone;
5113}
5114
5119
5124
5126{
5127 return m_classDef;
5128}
5129
5134
5139
5141{
5142 return m_fileDef;
5143}
5144
5146{
5147 return m_fileDef;
5148}
5149
5151{
5152 return m_nspace;
5153}
5154
5159
5161{
5162 return m_read;
5163}
5164
5166{
5167 return m_write;
5168}
5169
5171{
5172 return m_group;
5173}
5174
5176{
5177 return m_group;
5178}
5179
5181{
5182 return m_moduleDef;
5183}
5184
5189
5194
5196{
5197 return m_groupStartLine;
5198}
5199
5201{
5202 return m_groupHasDocs;
5203}
5204
5206{
5207 return m_prot;
5208}
5209
5211{
5212 return m_mtype;
5213}
5214
5216{
5217 return m_mtype==MemberType::Signal;
5218}
5219
5221{
5222 return m_mtype==MemberType::Slot;
5223}
5224
5226{
5227 return m_mtype==MemberType::Variable;
5228}
5229
5231{
5232 return m_mtype==MemberType::Enumeration;
5233}
5234
5236{
5237 return m_mtype==MemberType::EnumValue;
5238}
5239
5241{
5242 return m_mtype==MemberType::Typedef;
5243}
5244
5246{
5247 return m_mtype==MemberType::Sequence;
5248}
5249
5251{
5252 return m_mtype==MemberType::Dictionary;
5253}
5254
5256{
5257 return m_mtype==MemberType::Function;
5258}
5259
5261{
5262 return m_mtype==MemberType::Variable &&
5264}
5265
5267{
5268 return m_mtype==MemberType::Define;
5269}
5270
5272{
5273 return m_mtype==MemberType::Friend;
5274}
5275
5277{
5278 return m_mtype==MemberType::DCOP;
5279}
5280
5282{
5283 return m_mtype==MemberType::Property;
5284}
5285
5287{
5288 return m_mtype==MemberType::Event;
5289}
5290
5292{
5293 return m_related == Relationship::Related;
5294}
5295
5297{
5298 return m_related == Relationship::Foreign;
5299}
5300
5302{
5303 return m_stat;
5304}
5305
5307{
5308 return m_memSpec.isInline();
5309}
5310
5312{
5313 return m_memSpec.isExplicit();
5314}
5315
5317{
5318 return m_memSpec.isMutable();
5319}
5320
5322{
5323 return m_memSpec.isThreadLocal();
5324}
5325
5327{
5328 return m_memSpec.isGettable();
5329}
5330
5332{
5333 return m_memSpec.isPrivateGettable();
5334}
5335
5337{
5338 return m_memSpec.isProtectedGettable();
5339}
5340
5342{
5343 return m_memSpec.isSettable();
5344}
5345
5347{
5348 return m_memSpec.isPrivateSettable();
5349}
5350
5352{
5353 return m_memSpec.isProtectedSettable();
5354}
5355
5357{
5358 return m_memSpec.isAddable();
5359}
5360
5362{
5363 return m_memSpec.isRemovable();
5364}
5365
5367{
5368 return m_memSpec.isRaisable();
5369}
5370
5372{
5373 return m_memSpec.isReadable();
5374}
5375
5377{
5378 return m_memSpec.isWritable();
5379}
5380
5382{
5383 return m_memSpec.isFinal();
5384}
5385
5387{
5388 return m_memSpec.isNew();
5389}
5390
5392{
5393 return m_memSpec.isSealed();
5394}
5395
5397{
5398 return m_memSpec.isOverride();
5399}
5400
5402{
5403 return m_memSpec.isInitonly();
5404}
5405
5407{
5408 return m_memSpec.isAbstract();
5409}
5410
5412{
5413 return m_memSpec.isOptional();
5414}
5415
5417{
5418 return m_memSpec.isRequired();
5419}
5420
5422{
5423 return m_memSpec.isNonAtomic();
5424}
5425
5427{
5428 return m_memSpec.isCopy();
5429}
5430
5432{
5433 return m_memSpec.isAssign();
5434}
5435
5437{
5438 return m_memSpec.isRetain();
5439}
5440
5442{
5443 return m_memSpec.isWeak();
5444}
5445
5447{
5448 return m_memSpec.isStrong();
5449}
5450
5452{
5453 return m_memSpec.isEnumStruct();
5454}
5455
5457{
5458 return m_mtype==MemberType::EnumValue &&
5459 m_enumScope &&
5461}
5462
5464{
5465 return m_memSpec.isUnretained();
5466}
5467
5469{
5470 return m_memSpec.isAlias();
5471}
5472
5474{
5475 return m_memSpec.isDefault();
5476}
5477
5479{
5480 return m_memSpec.isDelete();
5481}
5482
5484{
5485 return m_memSpec.isNoExcept();
5486}
5487
5489{
5490 return m_memSpec.isAttribute();
5491}
5492
5494{
5495 return m_memSpec.isProperty();
5496}
5497
5499{
5500 return m_memSpec.isReadonly();
5501}
5502
5504{
5505 return m_memSpec.isBound();
5506}
5507
5509{
5510 return m_memSpec.isConstrained();
5511}
5512
5514{
5515 return m_memSpec.isTransient();
5516}
5517
5519{
5520 return m_memSpec.isMaybeVoid();
5521}
5522
5524{
5525 return m_memSpec.isMaybeDefault();
5526}
5527
5529{
5530 return m_memSpec.isMaybeAmbiguous();
5531}
5532
5534{
5535 return m_memSpec.isPublished();
5536}
5537
5538
5540{
5541 return m_implOnly;
5542}
5543
5545{
5546 return m_explExt;
5547}
5548
5550{
5551 return m_tspec;
5552}
5553
5555{
5556 return isFunction() ||
5557 isSlot() ||
5558 isSignal() ||
5559 isConstructor() ||
5560 isDestructor() ||
5561 isObjCMethod() ||
5562 isFriend();
5563}
5564
5566{
5567 return m_relatedAlso;
5568}
5569
5571{
5572 return m_docEnumValues;
5573}
5574
5576{
5577 return m_annEnumType;
5578}
5579
5584
5589
5591{
5592 return m_docsForDefinition;
5593}
5594
5596{
5597 return m_enumScope;
5598}
5599
5601{
5602 return m_livesInsideEnum;
5603}
5604
5606{
5607 return m_memSpec.isLocal();
5608}
5609
5611{
5612 return m_memSpec.isNoDiscard();
5613}
5614
5616{
5617 return m_memSpec.isConstExpr();
5618}
5619
5621{
5622 return m_memSpec.isConstEval();
5623}
5624
5626{
5627 return m_memSpec.isConstInit();
5628}
5629
5631{
5632 return m_enumFields;
5633}
5634
5636{
5637 return m_examples;
5638}
5639
5641{
5642 return m_proto;
5643}
5644
5646{
5647 return m_defArgList;
5648}
5649
5651{
5652 return m_declArgList;
5653}
5654
5656{
5657 ArgumentList &decAl = m_declArgList;
5658 ArgumentList &defAl = m_defArgList;
5659 const ArgumentList &decAlSrc = md->declArgumentList();
5660 const ArgumentList &defAlSrc = md->argumentList();
5661 auto decSrc = decAlSrc.begin(), defSrc = defAlSrc.begin();
5662 for (auto decIt = decAl.begin(), defIt = defAl.begin();
5663 decIt != decAl.end() && defIt != defAl.end() && decSrc != decAlSrc.end() && defSrc != defAlSrc.end();
5664 ++decIt, ++defIt, ++decSrc, ++defSrc++)
5665 {
5666 Argument &decA = *decIt;
5667 Argument &defA = *defIt;
5668 const Argument &decAS = *decSrc;
5669 const Argument &defAS = *defSrc;
5670 if (decA.name.empty())
5671 {
5672 if (!defA.name.empty())
5673 {
5674 decA.name = defA.name;
5675 }
5676 else if (!decAS.name.empty())
5677 {
5678 decA.name = decAS.name;
5679 }
5680 else if (!defAS.name.empty())
5681 {
5682 decA.name = defAS.name;
5683 }
5684 }
5685 if (defA.name.empty())
5686 {
5687 if (!decA.name.empty())
5688 {
5689 defA.name = decA.name;
5690 }
5691 else if (!decAS.name.empty())
5692 {
5693 defA.name = decAS.name;
5694 }
5695 else if (!defAS.name.empty())
5696 {
5697 defA.name = defAS.name;
5698 }
5699 }
5700 }
5701}
5702
5704{
5705 return m_tArgList;
5706}
5707
5712
5714{
5715 return m_grpId;
5716}
5717
5722
5724{
5725 return m_hasCallGraph;
5726}
5727
5729{
5730 bool enabled = m_hasCallGraph &&
5731 (isFunction() || isSlot() || isSignal()) &&
5732 Config_getBool(HAVE_DOT);
5733 if (enabled)
5734 {
5735 bool trivial = DotCallGraph::isTrivial(this,false);
5736 return !trivial;
5737 }
5738 return false;
5739}
5740
5742{
5743 return m_hasCallerGraph;
5744}
5745
5747{
5748 bool enabled = m_hasCallerGraph &&
5749 (isFunction() || isSlot() || isSignal()) &&
5750 Config_getBool(HAVE_DOT);
5751 if (enabled)
5752 {
5753 bool trivial = DotCallGraph::isTrivial(this,true);
5754 return !trivial;
5755 }
5756 return false;
5757}
5758
5763
5768
5770{
5771 return m_hasInlineSource;
5772}
5773
5775{
5776 return m_hasEnumValues;
5777}
5778
5780{
5781 return m_templateMaster;
5782}
5783
5784std::optional<ArgumentList> MemberDefImpl::formalTemplateArguments() const
5785{
5787}
5788
5790{
5791 return m_isTypedefValCached;
5792}
5793
5798
5803
5805{
5806 //printf("MemberDefImpl::getCachedResolvedTypedef()=%s\n",qPrint(m_cachedResolvedType));
5807 return m_cachedResolvedType;
5808}
5809
5811{
5812 return m_memDef;
5813}
5814
5816{
5817 return m_memDec;
5818}
5819
5821{
5822 return m_docProvider;
5823}
5824
5826{
5827 return m_groupAlias;
5828}
5829
5834
5836{
5837 return m_declLine;
5838}
5839
5841{
5842 return m_declColumn;
5843}
5844
5845
5846//----------------------------------------------
5847
5853
5855{
5856 m_def=d;
5857}
5858
5866
5868{
5869 m_moduleDef=mod;
5870}
5871
5877
5882
5887
5892
5897
5899{
5900 for (const auto &sx : qualifiers)
5901 {
5902 bool alreadyAdded = std::find(m_qualifiers.begin(), m_qualifiers.end(), sx) != m_qualifiers.end();
5903 if (!alreadyAdded)
5904 {
5905 m_qualifiers.push_back(sx);
5906 }
5907 }
5908}
5909
5914
5916{
5917 if (lines!=-1)
5918 {
5919 m_userInitLines=lines;
5920 }
5921}
5922
5924{
5925 m_read=r;
5926}
5927
5929{
5930 m_write=w;
5931}
5932
5934{
5935 m_tspec=b;
5936}
5937
5939{
5940 m_related = Relationship::Related;
5942}
5943
5945{
5946 m_related = Relationship::Foreign;
5948}
5949
5951{
5952 m_docProvider = md;
5953}
5954
5956{
5957 m_args = as;
5958}
5959
5964
5971
5973{
5974 m_docEnumValues=value;
5975}
5976
5978{
5979 m_annEnumType = md;
5980}
5981
5986
5991
5992void MemberDefImpl::setPrototype(bool p,const DString &df,int line,size_t column)
5993{
5994 m_proto=p;
5995 if (p)
5996 {
5997 setDeclFile(df,line,column);
5998 }
5999 else
6000 {
6001 setDefFile(df,line,column);
6002 }
6003}
6004
6005void MemberDefImpl::setExplicitExternal(bool b,const DString &df,int line,size_t column)
6006{
6007 m_explExt=b;
6008 if (b)
6009 {
6010 setDeclFile(df,line,column);
6011 }
6012 else
6013 {
6014 setDefFile(df,line,column);
6015 }
6016}
6017
6018void MemberDefImpl::setDeclFile(const DString &df,int line,size_t column)
6019{
6020 m_declFileName = df;
6021 m_declLine = line;
6022 m_declColumn = column;
6023}
6024
6026{
6027 m_grpId=id;
6028}
6029
6034
6040
6045
6050
6052{
6053 m_groupAlias = md;
6054}
6055
6060
6065
6070
6072{
6073 return m_category;
6074}
6075
6077{
6078 m_category = def;
6079}
6080
6082{
6083 return m_categoryRelation;
6084}
6085
6090
6092{
6093 m_enumBaseType = type;
6094}
6095
6097{
6098 return m_enumBaseType;
6099}
6100
6102{
6103 m_requiresClause = req;
6104}
6105
6110
6111void MemberDefImpl::cacheTypedefVal(const ClassDef*val, const DString & templSpec, const DString &resolvedType)
6112{
6115 m_cachedTypedefTemplSpec=templSpec;
6116 m_cachedResolvedType=resolvedType;
6117 //printf("MemberDefImpl::cacheTypedefVal=%s m_impl=%p\n",qPrint(m_cachedResolvedType),m_impl);
6118}
6119
6121{
6122 {
6123 const ArgumentList &srcAl = bmd->argumentList();
6124 ArgumentList &dstAl = m_defArgList;
6125 auto srcIt = srcAl.begin();
6126 auto dstIt = dstAl.begin();
6127 while ( srcIt!=srcAl.end() && dstIt!=dstAl.end())
6128 {
6129 Argument &argDst = *dstIt;
6130 const Argument &argSrc = *srcIt;
6131 if (!argSrc.name.empty())
6132 {
6133 argDst.name = argSrc.name;
6134 }
6135 argDst.docs = argSrc.docs;
6136 ++srcIt;
6137 ++dstIt;
6138 }
6139 }
6140
6141 {
6142 const ArgumentList &srcAl = bmd->declArgumentList();
6143 ArgumentList &dstAl = m_declArgList;
6144 auto srcIt = srcAl.begin();
6145 auto dstIt = dstAl.begin();
6146
6147 while ( srcIt!=srcAl.end() && dstIt!=dstAl.end())
6148 {
6149 Argument &argDst = *dstIt;
6150 const Argument &argSrc = *srcIt;
6151 if (!argSrc.name.empty())
6152 {
6153 argDst.name = argSrc.name;
6154 }
6155 argDst.docs = argSrc.docs;
6156 ++srcIt;
6157 ++dstIt;
6158 }
6159 }
6160}
6161
6163{
6164 for (Argument &a : al)
6165 {
6166 a.canType.clear();
6167 }
6168}
6169
6175
6180
6182{
6183 return m_numberOfFlowKW;
6184}
6185
6186//----------------
6187
6189{
6190 return DefinitionMixin::name();
6191}
6192
6193//----------------
6194
6196{
6197 for (auto decIt = decAl.begin(), defIt = defAl.begin();
6198 decIt!= decAl.end() && defIt!= defAl.end();
6199 ++decIt, ++defIt)
6200 {
6201 Argument &decA = *decIt;
6202 Argument &defA = *defIt;
6203 if (decA.docs.empty() && !defA.docs.empty())
6204 {
6205 decA.docs = defA.docs;
6206 }
6207 else if (defA.docs.empty() && !decA.docs.empty())
6208 {
6209 defA.docs = decA.docs;
6210 }
6211 //printf("transferArgumentDocumentation(%s<->%s)\n",qPrint(decA.name),qPrint(defA.name));
6212 if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
6213 {
6214 if (decA.name.empty() && !defA.name.empty())
6215 {
6216 decA.name = defA.name;
6217 }
6218 else if (defA.name.empty() && !decA.name.empty())
6219 {
6220 defA.name = decA.name;
6221 }
6222 }
6223 }
6224}
6225
6227{
6228 AUTO_TRACE("mdec='{}' mdef='{}' mdec.isPrototype={} mdef.isPrototype={}",
6229 mdec->name(), mdef->name(), mdec->isPrototype(), mdef->isPrototype());
6230 if (
6231 (!mdef->isDocTransferDone() || !mdec->isDocTransferDone()) &&
6232 (
6233 (mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
6234 (mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
6235 )
6236 )
6237 {
6238 bool sameNumTemplateArgs = mdef->templateArguments().size()==mdec->templateArguments().size();
6239
6240 ArgumentList &mdefAl = const_cast<ArgumentList&>(mdef->argumentList());
6241 ArgumentList &mdecAl = const_cast<ArgumentList&>(mdec->argumentList());
6242 if (sameNumTemplateArgs &&
6243 matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdef->typeString(),&mdefAl,
6244 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),&mdecAl,
6245 true,mdef->getLanguage()
6246 )
6247 ) /* match found */
6248 {
6249 AUTO_TRACE_ADD("combining definition and declaration");
6250
6251 if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
6252 {
6253 mdec->resolveUnnamedParameters(mdef);
6254 }
6255
6256 // first merge argument documentation
6257 transferArgumentDocumentation(mdecAl,mdefAl);
6258
6259 // copy brief description between definition and declaration
6260 DString mdefBrief = mdef->briefDescription();
6261 DString mdecBrief = mdec->briefDescription();
6262 DString mdefBriefFile = mdef->briefFile();
6263 DString mdecBriefFile = mdec->briefFile();
6264 int mdefBriefLine = mdef->briefLine();
6265 int mdecBriefLine = mdec->briefLine();
6266 if (!mdef->isDocTransferDone() && !mdecBrief.empty())
6267 {
6268 mdef->setBriefDescription(mdecBrief,mdecBriefFile,mdecBriefLine);
6269 }
6270 if (!mdec->isDocTransferDone() && !mdefBrief.empty())
6271 {
6272 mdec->setBriefDescription(mdefBrief,mdefBriefFile,mdefBriefLine);
6273 }
6274
6275 // copy detailed description between definition and declaration
6276 DString mdefDocs = mdef->documentation();
6277 DString mdecDocs = mdec->documentation();
6278 DString mdefFile = mdef->docFile();
6279 DString mdecFile = mdec->docFile();
6280 int mdefLine = mdef->docLine();
6281 int mdecLine = mdec->docLine();
6282 bool mdefDocsForDef = mdef->isDocsForDefinition();
6283 bool mdecDocsForDef = mdec->isDocsForDefinition();
6284 if (!mdec->isDocTransferDone() && !mdefDocs.empty())
6285 {
6286 //printf("transferring docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
6287 mdec->setDocumentation(mdefDocs,mdefFile,mdefLine);
6288 mdec->setDocsForDefinition(mdefDocsForDef);
6289 if (mdefAl.hasParameters())
6290 {
6291 auto mdefAlComb = stringToArgumentList(mdef->getLanguage(),mdef->argsString());
6292 transferArgumentDocumentation(mdefAl,*mdefAlComb);
6293 mdec->moveArgumentList(std::move(mdefAlComb));
6294 }
6295 }
6296 if (!mdef->isDocTransferDone() && !mdecDocs.empty())
6297 {
6298 //printf("transferring docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
6299 mdef->setDocumentation(mdecDocs,mdecFile,mdecLine);
6300 mdef->setDocsForDefinition(mdecDocsForDef);
6301 if (mdecAl.hasParameters())
6302 {
6303 auto mdecAlComb = stringToArgumentList(mdec->getLanguage(),mdec->argsString());
6304 transferArgumentDocumentation(mdecAl,*mdecAlComb);
6305 mdef->moveDeclArgumentList(std::move(mdecAlComb));
6306 }
6307 }
6308
6309 // copy inbody documentation between definition and declaration
6310 DString mdefInbodyDocs = mdef->inbodyDocumentation();
6311 DString mdecInbodyDocs = mdec->inbodyDocumentation();
6312 DString mdefInbodyFile = mdef->inbodyFile();
6313 DString mdecInbodyFile = mdec->inbodyFile();
6314 int mdefInbodyLine = mdef->inbodyLine();
6315 int mdecInbodyLine = mdec->inbodyLine();
6316 if (!mdec->isDocTransferDone() && !mdefInbodyDocs.empty())
6317 {
6318 mdec->setInbodyDocumentation(mdefInbodyDocs,mdefInbodyFile,mdefInbodyLine);
6319 }
6320 if (!mdef->isDocTransferDone() && !mdecInbodyDocs.empty())
6321 {
6322 mdef->setInbodyDocumentation(mdecInbodyDocs,mdecInbodyFile,mdecInbodyLine);
6323 }
6324
6325 if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1)
6326 {
6327 //printf("body mdec->mdef %d-%d\n",mdec->getStartBodyLine(),mdef->getEndBodyLine());
6328 mdef->setBodySegment(mdec->getDefLine(),mdec->getStartBodyLine(),mdec->getEndBodyLine());
6329 mdef->setBodyDef(mdec->getBodyDef());
6330 //mdef->setBodyMember(mdec);
6331 }
6332 else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1)
6333 {
6334 //printf("body mdef->mdec %d-%d\n",mdef->getStartBodyLine(),mdec->getEndBodyLine());
6335 mdec->setBodySegment(mdef->getDefLine(),mdef->getStartBodyLine(),mdef->getEndBodyLine());
6336 mdec->setBodyDef(mdef->getBodyDef());
6337 //mdec->setBodyMember(mdef);
6338 }
6341
6342 // copy group info.
6343 if (mdec->getGroupDef()==nullptr && mdef->getGroupDef()!=nullptr)
6344 {
6345 mdec->setGroupDef(mdef->getGroupDef(),
6346 mdef->getGroupPri(),
6347 mdef->docFile(),
6348 mdef->docLine(),
6349 mdef->hasDocumentation(),
6350 mdef
6351 );
6352 }
6353 else if (mdef->getGroupDef()==nullptr && mdec->getGroupDef()!=nullptr)
6354 {
6355 mdef->setGroupDef(mdec->getGroupDef(),
6356 mdec->getGroupPri(),
6357 mdec->docFile(),
6358 mdec->docLine(),
6359 mdec->hasDocumentation(),
6360 mdec
6361 );
6362 }
6363
6364
6365 mdec->mergeRefItems(mdef);
6366 mdef->mergeRefItems(mdec);
6367
6368 mdef->setMemberDeclaration(mdec);
6369 mdec->setMemberDefinition(mdef);
6370
6371 mergeMemberOverrideOptions(mdec,mdef);
6372
6373 mdef->addQualifiers(mdec->getQualifiers());
6374 mdec->addQualifiers(mdef->getQualifiers());
6375
6376 mdef->setDocTransferDone();
6377 mdec->setDocTransferDone();
6378 }
6379 }
6380}
6381
6383{
6384 if (Config_getBool(CALL_GRAPH) !=md1->hasCallGraph()) md2->overrideCallGraph(md1->hasCallGraph());
6385 if (Config_getBool(CALLER_GRAPH)!=md1->hasCallerGraph()) md2->overrideCallerGraph(md1->hasCallerGraph());
6386 if (Config_getBool(CALL_GRAPH) !=md2->hasCallGraph()) md1->overrideCallGraph( md2->hasCallGraph());
6387 if (Config_getBool(CALLER_GRAPH)!=md2->hasCallerGraph()) md1->overrideCallerGraph(md2->hasCallerGraph());
6388
6389 if (Config_getBool(SHOW_ENUM_VALUES) !=md1->hasEnumValues()) md2->overrideEnumValues(md1->hasEnumValues());
6390 if (Config_getBool(SHOW_ENUM_VALUES) !=md2->hasEnumValues()) md1->overrideEnumValues( md2->hasEnumValues());
6391
6392 if (Config_getBool(REFERENCED_BY_RELATION)!=md1->hasReferencedByRelation()) md2->overrideReferencedByRelation(md1->hasReferencedByRelation());
6393 if (Config_getBool(REFERENCES_RELATION) !=md1->hasReferencesRelation()) md2->overrideReferencesRelation(md1->hasReferencesRelation());
6394 if (Config_getBool(REFERENCED_BY_RELATION)!=md2->hasReferencedByRelation()) md1->overrideReferencedByRelation(md2->hasReferencedByRelation());
6395 if (Config_getBool(REFERENCES_RELATION) !=md2->hasReferencesRelation()) md1->overrideReferencesRelation(md2->hasReferencesRelation());
6396
6397 if (Config_getBool(INLINE_SOURCES)!=md1->hasInlineSource()) md2->overrideInlineSource(md1->hasInlineSource());
6398 if (Config_getBool(INLINE_SOURCES)!=md2->hasInlineSource()) md1->overrideInlineSource(md2->hasInlineSource());
6399}
6400
6402{
6403 if (m_templateMaster)
6404 {
6405 return m_templateMaster->briefDescription(abbr);
6406 }
6407 else
6408 {
6410 }
6411}
6412
6414{
6415 if (m_templateMaster)
6416 {
6418 }
6419 else
6420 {
6422 }
6423}
6424
6426{
6427 if (m_templateMaster)
6428 {
6430 }
6431 else
6432 {
6434 }
6435}
6436
6438{
6439 return m_typeConstraints;
6440}
6441
6442
6444 const DString &includeName,bool local, bool force)
6445{
6446 if (!force || includeName.empty()) return;
6447 //printf("MemberDefImpl::setIncludeFile(%p,%s,%d,%d)\n",fd,includeName,local,force);
6448 if (!m_incInfo) m_incInfo = std::make_unique<IncludeInfo>();
6449 m_incInfo->fileDef = fd;
6450 m_incInfo->includeName = includeName;
6452}
6453
6455{
6456 bool hideFriendCompounds = Config_getBool(HIDE_FRIEND_COMPOUNDS);
6457 bool isFriendToHide = hideFriendCompounds && isTypeAClassFriend(m_type);
6458 return isFriendToHide;
6459}
6460
6462{
6463 return isFriend() && isTypeAClassFriend(m_type);
6464}
6465
6466
6468{
6469 return !(isFriend() && isFriendToHide());
6470}
6471
6473{
6474 return isFunction() || isSlot() || isSignal();
6475}
6476
6478{
6479 return isRelated() || isForeign() || (isFriend() && !isFriendToHide());
6480}
6481
6487
6489{
6490 switch (memberType())
6491 {
6492 case MemberType::Define: return CodeSymbolType::Define;
6493 case MemberType::Function: return CodeSymbolType::Function;
6494 case MemberType::Variable: return CodeSymbolType::Variable;
6495 case MemberType::Typedef: return CodeSymbolType::Typedef;
6496 case MemberType::Enumeration: return CodeSymbolType::Enumeration;
6497 case MemberType::EnumValue: return CodeSymbolType::EnumValue;
6498 case MemberType::Signal: return CodeSymbolType::Signal;
6499 case MemberType::Slot: return CodeSymbolType::Slot;
6500 case MemberType::Friend: return CodeSymbolType::Friend;
6501 case MemberType::DCOP: return CodeSymbolType::DCOP;
6502 case MemberType::Property: return CodeSymbolType::Property;
6503 case MemberType::Event: return CodeSymbolType::Event;
6504 case MemberType::Interface: return CodeSymbolType::Interface;
6505 case MemberType::Service: return CodeSymbolType::Service;
6506 case MemberType::Sequence: return CodeSymbolType::Sequence;
6507 case MemberType::Dictionary: return CodeSymbolType::Dictionary;
6508 }
6510}
6511
6513{
6514 return m_redefineCount;
6515}
6516
6518{
6519 m_redefineCount=count;
6520}
6521
6522//-------------------------------------------------------------------------------
6523// Helpers
6524
6526
6528{
6529 MemberDefMutable *src = toMemberDefMutable(const_cast<MemberDef*>(s));
6530 MemberDefMutable *dst = toMemberDefMutable(const_cast<MemberDef*>(d));
6531 if (src==nullptr || dst==nullptr) return;
6532 //printf("--> addDocCrossReference src=%s,dst=%s\n",qPrint(src->name()),qPrint(dst->name()));
6533 if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
6534 if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
6535 src->isCallable()
6536 )
6537 {
6538 DString sourceRefName = src->sourceRefName();
6541
6542 // ---- critical section
6543 std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6544 dst->addSourceReferencedBy(src,sourceRefName);
6545 if (mdDef)
6546 {
6547 mdDef->addSourceReferencedBy(src,sourceRefName);
6548 }
6549 if (mdDecl)
6550 {
6551 mdDecl->addSourceReferencedBy(src,sourceRefName);
6552 }
6553 // ---- end critical section
6554 }
6555 if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
6556 src->isCallable()
6557 )
6558 {
6559 DString sourceRefName = dst->sourceRefName();
6562
6563 // ---- critical section
6564 std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6565 src->addSourceReferences(dst,sourceRefName);
6566 if (mdDef)
6567 {
6568 mdDef->addSourceReferences(dst,sourceRefName);
6569 }
6570 if (mdDecl)
6571 {
6572 mdDecl->addSourceReferences(dst,sourceRefName);
6573 }
6574 // ---- end critical section
6575 }
6576}
6577
6578// --- Cast functions
6579//
6581{
6582 if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
6583 {
6584 return static_cast<MemberDef*>(d);
6585 }
6586 else
6587 {
6588 return nullptr;
6589 }
6590}
6591
6593{
6594 Definition *d = toDefinition(md);
6595 if (d && typeid(*d)==typeid(MemberDefImpl))
6596 {
6597 return static_cast<MemberDef*>(d);
6598 }
6599 else
6600 {
6601 return nullptr;
6602 }
6603}
6604
6606{
6607 if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
6608 {
6609 return static_cast<const MemberDef*>(d);
6610 }
6611 else
6612 {
6613 return nullptr;
6614 }
6615}
6616
6618{
6619 if (d && typeid(*d)==typeid(MemberDefImpl))
6620 {
6621 return static_cast<MemberDefMutable*>(d);
6622 }
6623 else
6624 {
6625 return nullptr;
6626 }
6627}
6628
6629
constexpr auto prefix
Definition anchor.cpp:47
This class contains the information about the argument of a function or template.
Definition arguments.h:27
DString docs
Definition arguments.h:48
DString attrib
Definition arguments.h:42
DString defval
Definition arguments.h:47
DString array
Definition arguments.h:46
DString name
Definition arguments.h:45
DString type
Definition arguments.h:43
This class represents an function or template argument list.
Definition arguments.h:66
RefQualifierType refQualifier() const
Definition arguments.h:117
iterator end()
Definition arguments.h:95
bool hasParameters() const
Definition arguments.h:77
Argument & front()
Definition arguments.h:106
DString trailingReturnType() const
Definition arguments.h:115
bool isDeleted() const
Definition arguments.h:116
size_t size() const
Definition arguments.h:101
bool constSpecifier() const
Definition arguments.h:112
bool hasDocumentation(bool allowEmptyNames=false) const
Definition arguments.cpp:26
bool empty() const
Definition arguments.h:100
bool hasTemplateDocumentation() const
Definition arguments.cpp:34
iterator begin()
Definition arguments.h:94
bool volatileSpecifier() const
Definition arguments.h:113
A abstract class representing of a compound symbol.
Definition classdef.h:100
virtual void writeDeclaration(OutputList &ol, bool inGroup, int indentLevel, const ClassDef *inheritedFrom, const DString &inheritId) const =0
virtual int isBaseClass(const ClassDef *bcd, bool followInstances, const DString &templSpec=DString()) 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 bool isObjectiveC() const =0
Returns true if this class is implemented in Objective-C.
virtual bool isSimple() const =0
virtual DString compoundTypeString() const =0
Returns the type of compound as a string.
virtual ClassDef * categoryOf() const =0
Returns the class of which this is a category (Objective-C only).
virtual bool isImplicitTemplateInstance() const =0
@ Interface
Definition classdef.h:108
virtual CompoundType compoundType() const =0
Returns the type of compound this is, i.e. class/struct/union/...
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
void clear()
Definition dstring.h:214
size_t rfind(char c, size_t pos=npos) const
Definition dstring.h:244
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:318
DString lower() const
Definition dstring.h:326
DString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple internal white...
Definition dstring.cpp:127
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
std::string_view view() const
Definition dstring.h:162
DString & remove(size_t index, size_t len)
Definition dstring.h:535
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:686
DString & append(char c)
Definition dstring.h:489
DString right(size_t len) const
Definition dstring.h:311
DString & prepend(const char *s)
Definition dstring.h:515
int contains(char c, bool cs=true) const
Definition dstring.cpp:85
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:337
DString left(size_t len) const
Definition dstring.h:306
const std::string & str() const
Definition dstring.h:645
bool stripPrefix(const DString &prefix)
Definition dstring.h:290
bool startsWith(const char *s) const
Definition dstring.h:600
bool endsWith(const char *s) const
Definition dstring.h:617
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:151
const Definition * getAlias() const
const Definition * getScope() const
DefinitionAliasMixin(const Definition *scope, const Definition *alias)
The common base class of all entity definitions found in the sources.
Definition definition.h:77
virtual DString briefDescription(bool abbreviate=false) const =0
virtual DString inbodyFile() const =0
virtual int getEndBodyLine() const =0
virtual DString briefFile() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual int docLine() const =0
virtual DString getDefFileName() const =0
virtual DString documentation() const =0
virtual bool isLinkable() const =0
virtual DString inbodyDocumentation() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual const DString & name() const =0
virtual const DString & localName() const =0
virtual int inbodyLine() const =0
virtual const FileDef * getBodyDef() const =0
virtual int briefLine() const =0
virtual bool hasDocumentation() const =0
virtual bool isLinkableInProject() const =0
virtual bool hasUserDocumentation() const =0
virtual bool isAnonymous() const =0
virtual DString displayName(bool includeScope=true) const =0
virtual DString qualifiedName() const =0
virtual DString anchor() const =0
virtual DString getReference() const =0
virtual CodeSymbolType codeSymbolType() const =0
virtual Definition * getOuterScope() const =0
virtual DString docFile() const =0
virtual int getStartBodyLine() const =0
virtual bool isReference() const =0
virtual DString getOutputFileBase() const =0
bool isReference() const override
DString docFile() const override
void writeSourceDef(OutputList &ol) const override
bool hasUserDocumentation() const override
DString qualifiedName() const override
bool hasBriefDescription() const override
void setDefFile(const DString &df, int defLine, size_t defColumn) override
DString briefFile() const override
bool hasRequirementRefs() const override
DString briefDescription(bool abbreviate=false) const override
const DString & name() const override
DString inbodyFile() const override
void setOuterScope(Definition *def) override
DString getReference() const override
void writeRequirementRefs(OutputList &ol) const override
void setInbodyDocumentation(const DString &doc, const DString &docFile, int docLine) override
const RefItemVector & xrefListItems() const override
bool hasSourceReffedBy() const override
size_t getDefColumn() const override
Definition * getOuterScope() const override
void setBriefDescription(const DString &brief, const DString &briefFile, int briefLine) override
void setDocumentation(const DString &doc, const DString &docFile, int docLine, bool stripWhiteSpace=true) override
const DString & localName() const override
void setReference(const DString &r) override
DString getDefFileExtension() const override
DString getDefFileName() const override
DString documentation() const override
DefinitionMixin(const DString &defFileName, int defLine, size_t defColumn, const DString &name, const char *b=nullptr, const char *d=nullptr, bool isSymbol=true)
const FileDef * getBodyDef() const override
DString inbodyDocumentation() const override
void writeSourceReffedBy(OutputList &ol, const DString &scopeName) const override
void writeInlineCode(OutputList &ol, const DString &scopeName) const override
void setHidden(bool b) override
DString getSourceFileBase() const override
void writeDocAnchorsToTagFile(TextStream &fs) const override
bool hasDocumentation() const override
void writeSourceRefs(OutputList &ol, const DString &scopeName) const override
SrcLangExt getLanguage() const override
virtual void setBodySegment(int defLine, int bls, int ble)=0
virtual void setInbodyDocumentation(const DString &d, const DString &docFile, int docLine)=0
virtual void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true)=0
virtual void addSourceReferences(MemberDef *d, const DString &sourceRefName)=0
virtual void addSourceReferencedBy(MemberDef *d, const DString &sourceRefName)=0
virtual void setBriefDescription(const DString &b, const DString &briefFile, int briefLine)=0
virtual void mergeRefItems(Definition *d)=0
virtual void setBodyDef(const FileDef *fd)=0
Representation of an call graph.
int numNodes() const
bool isTooBig() const
bool isTrivial() const
static bool suppressDocWarnings
Definition doxygen.h:123
static bool parseSourcesNeeded
Definition doxygen.h:116
static ParserManager * parserManager
Definition doxygen.h:122
static NamespaceDefMutable * globalScope
Definition doxygen.h:114
bool inSort(const Example &ex)
Definition example.h:39
A model of a file symbol.
Definition filedef.h:97
virtual DString absFilePath() const =0
A model of a group of symbols.
Definition groupdef.h:48
bool hasEnumValues() const override
bool isConstEval() const override
const ClassDef * getCachedTypedefVal() const override
NamespaceDef * getNamespaceDef() override
void writeDeclaration(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool inGroup, int indentLevel, const ClassDef *inheritFrom=nullptr, const DString &inheritId=DString()) const override
const NamespaceDef * getNamespaceDef() const override
bool hasExamples() const override
DString getGroupFileName() const override
GroupDef * getGroupDef() override
bool isSettable() const override
bool isConstrained() const override
bool getGroupHasDocs() const override
const ClassDef * getClassDef() const override
const MemberDef * inheritsDocsFrom() const override
bool hasCallerGraph() const override
bool isConstInit() const override
bool isFinal() const override
void writeLink(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool onlyText=false) const override
const MemberDef * reimplements() const override
DString argsString() const override
const DString & initializer() const override
bool isOptional() const override
const ClassDef * getClassDefOfAnonymousType() const override
bool isTypeAlias() const override
bool isRequired() const override
bool isRemovable() const override
void setMemberGroup(MemberGroup *grp) override
bool isDeleted() const override
bool isPrivateGettable() const override
bool isSignal() const override
MemberDef * memberDeclaration() const override
size_t getDeclColumn() const override
bool isFriendClass() const override
const MemberDef * getGroupAlias() const override
bool isStrongEnumValue() const override
bool isAssign() const override
DString typeString() const override
int getGroupStartLine() const override
std::unique_ptr< MemberDef > deepCopy() const override
bool isUNOProperty() const override
void warnIfUndocumented() const override
bool hasUserDocumentation() const override
DString getOutputFileBase() const override
bool isSliceLocal() const override
const ArgumentLists & definitionTemplateParameterLists() const override
bool isPublished() const override
bool isSequence() const override
bool isDictionary() const override
bool isVariable() const override
FileDef * getFileDef() override
const MemberDef * templateMaster() const override
void warnIfUndocumentedParams() const override
const MemberDef * anonymousMemberForDetails() const override
bool isExternal() const override
DString excpString() const override
bool isProperty() const override
bool isWritable() const override
bool isDocumentedFriendClass() const override
int redefineCount() const override
bool isConstExpr() const override
int initializerLines() const override
bool isMaybeVoid() const override
int getMemberGroupId() const override
DString objCMethodName(bool localLink, bool showStatic) const override
bool isInitonly() const override
const ExampleList & getExamples() const override
bool hasOneLineInitializer() const override
bool isProtectedGettable() const override
bool hasDocumentation() const override
bool livesInsideEnum() const override
bool hasCallGraph() const override
bool isCopy() const override
DString displayDefinition() const override
DString getWriteAccessor() const override
int getDeclLine() const override
bool isEnumerate() const override
DString getReference() const override
bool isReference() const override
TypeSpecifier getMemberSpecifiers() const override
bool isThreadLocal() const override
bool hasMultiLineInitializer() const override
bool isDocsForDefinition() const override
Grouping::GroupPri_t getGroupPri() const override
bool isTypedefValCached() const override
bool isRaisable() const override
bool isUnretained() const override
bool isGettable() const override
const MemberVector & enumFieldList() const override
DString anchor() const override
bool isObjCProperty() const override
DString qualifiedName() const override
const ArgumentList & declArgumentList() const override
DString briefDescription(bool) const override
bool isCallable() const override
bool isDefine() const override
bool isLinkableInProject() const override
bool hasDetailedDescription() const override
bool isFriendToHide() const override
DString getCachedTypedefTemplSpec() const override
const MemberDef * anonymousMemberForDeclaration() const override
const GroupDef * getGroupDef() const override
bool isDestructor() const override
bool isNoDiscard() const override
bool hasDocumentedEnumValues() const override
bool isBound() const override
void detectUndocumentedParams(bool, bool) const override
DString requiresClause() const override
bool isFunctionPtr() const override
StringVector getLabels(const Definition *container) const override
std::unique_ptr< MemberDef > createTemplateInstanceMember(const ArgumentList &formalArgs, const std::unique_ptr< ArgumentList > &actualArgs) const override
bool isAddable() const override
const ArgumentList & argumentList() const override
const ArgumentList & typeConstraints() const override
Specifier virtualness(int) const override
bool isFunctionOrSignalSlot() const override
bool isDefault() const override
bool isPrototype() const override
bool isAttribute() const override
MemberDef * memberDefinition() const override
bool isTypedef() const override
bool isNoExcept() const override
bool isInline() const override
bool isRelatedOrFriend() const override
bool hasReferencesRelation() const override
bool isStrong() const override
const MemberDef * getMdAlias() const
bool isObjCMethod() const override
const DString & name() const override
bool isAbstract() const override
DString extraTypeChars() const override
bool isStatic() const override
bool isPrivateSettable() const override
bool isSealed() const override
bool isRelated() const override
MemberDef * getMdAlias()
DString memberTypeName() const override
bool isOverride() const override
bool isForeign() const override
bool isImplementation() const override
const MemberVector & reimplementedBy() const override
VhdlSpecifier getVhdlSpecifiers() const override
bool isMaybeDefault() const override
MemberType memberType() const override
bool isLinkable() const override
DString getDeclFileName() const override
bool isProtectedSettable() const override
bool isReadonly() const override
DString declaration() const override
DString getCachedResolvedTypedef() const override
const MemberDef * categoryRelation() const override
ClassDef * getClassDef() override
DString documentation() const override
MemberDefAliasImpl(const Definition *newScope, const MemberDef *md)
const MemberDef * getEnumScope() const override
DString getReadAccessor() const override
Protection protection() const override
bool isSlot() const override
DString displayName(bool b=true) const override
bool isDelete() const override
bool isReadable() const override
bool isEvent() const override
bool isNonAtomic() const override
DefType definitionType() const override
DString getScopeString() const override
bool isReimplementedBy(const ClassDef *cd) const override
bool isDCOP() const override
DString bitfieldString() const override
void writeEnumDeclaration(OutputList &typeDecl, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod) const override
bool isDocTransferDone() const override
bool isDetailedSectionVisible(MemberListContainer container) const override
bool isNotFriend() const override
const MemberList * getSectionList(const Definition *container) const override
bool isTemplateSpecialization() const override
const ModuleDef * getModuleDef() const override
bool isExplicit() const override
DString enumBaseType() const override
CodeSymbolType codeSymbolType() const override
bool isConstructor() const override
bool isTransient() const override
int numberOfFlowKeyWords() const override
bool isFriend() const override
bool isWeak() const override
bool isMutable() const override
MemberDef * resolveAlias() override
const FileDef * getFileDef() const override
std::optional< ArgumentList > formalTemplateArguments() const override
DString sourceRefName() const override
DString definition() const override
const MemberDef * resolveAlias() const override
bool isEnumValue() const override
bool isNew() const override
const MemberDef * getAnonymousEnumType() const override
bool isMaybeAmbiguous() const override
bool hasReferencedByRelation() const override
DString fieldType() const override
bool isCSharpProperty() const override
bool hasInlineSource() const override
ClassDef * category() const override
void moveTo(Definition *) override
MemberGroup * getMemberGroup() const override
MemberGroup * m_memberGroup
bool isFunction() const override
DString getDeclType() const override
bool visibleInIndex() const override
ClassDef * relatedAlso() const override
bool isRetain() const override
bool isEnumStruct() const override
bool isBriefSectionVisible() const override
const ArgumentList & templateArguments() const override
~MemberDefAliasImpl() override
StringVector getQualifiers() const override
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
virtual bool isConstExpr() const =0
virtual bool getGroupHasDocs() const =0
virtual const MemberDef * getAnonymousEnumType() const =0
virtual bool isConstEval() const =0
virtual bool isInitonly() const =0
virtual bool isSignal() const =0
virtual bool isNoExcept() const =0
virtual bool isDestructor() const =0
virtual DString getDeclType() const =0
virtual bool hasDetailedDescription() const =0
virtual bool isAssign() const =0
virtual bool isExplicit() const =0
virtual MemberDef * memberDefinition() const =0
virtual bool isNew() const =0
virtual bool isObjCMethod() const =0
virtual bool hasDocumentedEnumValues() const =0
virtual MemberDef * memberDeclaration() const =0
virtual DString requiresClause() const =0
virtual bool isMaybeVoid() const =0
virtual bool isConstructor() const =0
virtual bool isFriend() const =0
virtual void writeEnumDeclaration(OutputList &typeDecl, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod) const =0
virtual DString argsString() const =0
virtual bool isForeign() const =0
virtual bool isSealed() const =0
virtual bool hasExamples() const =0
virtual bool isDelete() const =0
virtual int numberOfFlowKeyWords() const =0
virtual const MemberDef * inheritsDocsFrom() const =0
virtual bool isDefault() const =0
virtual DString objCMethodName(bool localLink, bool showStatic) const =0
virtual bool isRelated() const =0
virtual bool isDocumentedFriendClass() const =0
virtual bool isConstInit() const =0
virtual bool isDeleted() const =0
virtual DString definition() const =0
virtual const ClassDef * getCachedTypedefVal() const =0
virtual bool isRelatedOrFriend() const =0
virtual void writeDeclaration(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *md, bool inGroup, int indentLevel=0, const ClassDef *inheritFrom=nullptr, const DString &inheritId=DString()) const =0
virtual bool isSequence() const =0
virtual bool isEnumStruct() const =0
virtual const ClassDef * getClassDef() const =0
virtual bool visibleInIndex() const =0
virtual const MemberDef * getGroupAlias() const =0
virtual bool isOverride() const =0
virtual bool hasReferencesRelation() const =0
virtual DString declaration() const =0
virtual DString excpString() const =0
virtual DString getCachedResolvedTypedef() const =0
virtual const ArgumentList & templateArguments() const =0
virtual DString getDeclFileName() const =0
virtual const DString & initializer() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isSettable() const =0
virtual bool isCSharpProperty() const =0
virtual bool isRetain() const =0
virtual bool isAddable() const =0
virtual bool isTypedef() const =0
virtual ClassDef * category() const =0
virtual bool isSlot() const =0
virtual const MemberVector & enumFieldList() const =0
virtual bool hasCallGraph() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isInline() const =0
virtual bool isEvent() const =0
virtual DString getReadAccessor() const =0
virtual const ArgumentList & argumentList() const =0
virtual bool isWritable() const =0
virtual bool isMaybeAmbiguous() const =0
virtual bool isPrivateGettable() const =0
virtual bool isStrongEnumValue() const =0
virtual VhdlSpecifier getVhdlSpecifiers() const =0
virtual const MemberVector & reimplementedBy() const =0
virtual int getGroupStartLine() const =0
virtual bool isFunction() const =0
virtual bool isRequired() const =0
virtual bool isAttribute() const =0
virtual bool isExternal() const =0
virtual bool isCopy() const =0
virtual int getMemberGroupId() const =0
virtual bool isDictionary() const =0
virtual DString bitfieldString() const =0
virtual int getDeclLine() const =0
virtual bool isTypeAlias() const =0
virtual bool isStatic() const =0
virtual const MemberDef * reimplements() const =0
virtual bool isMaybeDefault() const =0
virtual bool livesInsideEnum() const =0
virtual bool hasInlineSource() const =0
virtual bool isTemplateSpecialization() const =0
virtual bool isPrivateSettable() const =0
virtual DString displayDefinition() const =0
virtual StringVector getQualifiers() const =0
virtual const MemberDef * anonymousMemberForDeclaration() const =0
virtual bool isRaisable() const =0
virtual bool isRemovable() const =0
virtual bool isTypedefValCached() const =0
virtual bool isConstrained() const =0
virtual DString getWriteAccessor() const =0
virtual bool isDocsForDefinition() const =0
virtual bool isBound() const =0
virtual bool hasEnumValues() const =0
virtual bool isFriendToHide() const =0
virtual bool isReimplementedBy(const ClassDef *cd) const =0
virtual bool isNonAtomic() const =0
virtual const ModuleDef * getModuleDef() const =0
virtual bool isThreadLocal() const =0
virtual bool isDefine() const =0
virtual DString extraTypeChars() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isPublished() const =0
virtual DString getScopeString() const =0
virtual bool isFunctionPtr() const =0
virtual DString sourceRefName() const =0
virtual std::unique_ptr< MemberDef > createTemplateInstanceMember(const ArgumentList &formalArgs, const std::unique_ptr< ArgumentList > &actualArgs) const =0
virtual bool hasCallerGraph() const =0
virtual Grouping::GroupPri_t getGroupPri() const =0
virtual const ArgumentList & typeConstraints() const =0
virtual const MemberDef * anonymousMemberForDetails() const =0
virtual size_t getDeclColumn() const =0
virtual bool isProtectedSettable() const =0
virtual const ClassDef * getClassDefOfAnonymousType() const =0
virtual bool isImplementation() const =0
virtual bool isProtectedGettable() const =0
virtual bool hasOneLineInitializer() const =0
virtual const MemberDef * templateMaster() const =0
virtual std::optional< ArgumentList > formalTemplateArguments() const =0
virtual bool isObjCProperty() const =0
virtual bool isTransient() const =0
virtual const MemberList * getSectionList(const Definition *container) const =0
virtual bool hasMultiLineInitializer() const =0
virtual Protection protection() const =0
virtual TypeSpecifier getMemberSpecifiers() const =0
virtual bool isOptional() const =0
virtual DString getCachedTypedefTemplSpec() const =0
virtual bool isEnumerate() const =0
virtual bool isGettable() const =0
virtual MemberType memberType() const =0
virtual bool hasReferencedByRelation() const =0
virtual bool isFunctionOrSignalSlot() const =0
virtual DString fieldType() const =0
virtual bool isReadable() const =0
virtual bool isWeak() const =0
virtual bool isDocTransferDone() const =0
virtual bool isNoDiscard() const =0
virtual DString enumBaseType() const =0
virtual bool isUnretained() const =0
virtual ClassDef * relatedAlso() const =0
virtual bool isBriefSectionVisible() const =0
virtual const ArgumentLists & definitionTemplateParameterLists() const =0
virtual StringVector getLabels(const Definition *container) const =0
virtual bool isVariable() const =0
virtual bool isNotFriend() const =0
virtual DString getGroupFileName() const =0
virtual bool isDCOP() const =0
virtual bool isStrong() const =0
virtual DString typeString() const =0
virtual bool isSliceLocal() const =0
virtual Specifier virtualness(int count=0) const =0
virtual bool isUNOProperty() const =0
virtual int redefineCount() const =0
virtual const MemberDef * categoryRelation() const =0
virtual int initializerLines() const =0
virtual bool isFinal() const =0
virtual const ArgumentList & declArgumentList() const =0
virtual const ExampleList & getExamples() const =0
virtual bool isAbstract() const =0
virtual DString memberTypeName() const =0
virtual bool isMutable() const =0
virtual bool isFriendClass() const =0
virtual bool isCallable() const =0
virtual bool isDetailedSectionVisible(MemberListContainer container) const =0
virtual const MemberDef * getEnumScope() const =0
virtual bool isEnumValue() const =0
virtual bool isPrototype() const =0
virtual void writeLink(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *md, bool onlyText=false) const =0
virtual bool isProperty() const =0
bool _hasVisibleCallerGraph() const
DString getCachedTypedefTemplSpec() const override
void _writeCallerGraph(OutputList &ol) const
void insertReimplementedBy(MemberDef *md) override
bool isDCOP() const override
DString enumBaseType() const override
VhdlSpecifier m_vhdlSpec
const MemberDef * anonymousMemberForDeclaration() const override
bool isDetailedSectionVisible(MemberListContainer container) const override
bool _isReimplements() const
bool isFunction() const override
void cacheTypedefVal(const ClassDef *val, const DString &templSpec, const DString &resolvedType) override
void overrideReferencesRelation(bool e) override
const MemberDef * reimplements() const override
MemberType m_mtype
int getMemberGroupId() const override
bool isProperty() const override
bool visibleInIndex() const override
const ArgumentList & argumentList() const override
void writeDocumentation(const MemberList *ml, int memCount, int memTotal, OutputList &ol, const DString &scopeName, const Definition *container, bool inGroup, bool showEnumValues=false, bool showInline=false) const override
void setDocumentedEnumValues(bool value) override
bool m_detailedDescriptionCachedValue
bool isTypedefValCached() const override
DString objCMethodName(bool localLink, bool showStatic) const override
bool isInline() const override
const ExampleList & getExamples() const override
ArgumentLists m_defTmpArgLists
DString getWriteAccessor() const override
bool isFriendToHide() const override
void invalidateTypedefValCache() override
bool isFriendClass() const override
void setNamespace(NamespaceDef *nd) override
void setProtection(Protection p) override
const NamespaceDef * getNamespaceDef() const override
void writeDeclaration(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool inGroup, int indentLevel, const ClassDef *inheritFrom=nullptr, const DString &inheritId=DString()) const override
void setHidden(bool b) override
void _writeTypeConstraints(OutputList &ol) const
bool isSliceLocal() const override
void makeRelated() override
int getGroupStartLine() const override
void setAnonymousMemberForDeclaration(const MemberDef *md) override
void warnIfUndocumented() const override
bool m_hasReferencedByRelation
void setMemberType(MemberType t) override
const ArgumentList & typeConstraints() const override
void setRequiresClause(const DString &req) override
DefType definitionType() const override
Definition memberdef.cpp:64
bool isDestructor() const override
StringVector getQualifiers() const override
Specifier m_virt
DString getDeclFileName() const override
void setRedefineCount(int) override
void setAnonymousEnumType(const MemberDef *md) override
bool isOptional() const override
void _writeExamples(OutputList &ol) const
void moveTo(Definition *) override
bool isCallable() const override
void setBriefDescription(const DString &b, const DString &briefFile, int briefLine) override
DString getScopeString() const override
bool m_docTransferDone
bool isBriefSectionVisible() const override
const MemberDef * m_categoryRelation
void setCategoryRelation(const MemberDef *) override
bool isReference() const override
DString m_cachedResolvedType
Protection m_prot
void warnIfUndocumentedParams() const override
VhdlSpecifier getVhdlSpecifiers() const override
bool _hasVisibleCallGraph() const
void setFormalTemplateArguments(const ArgumentList &al) override
ClassDef * m_category
DString extraTypeChars() const override
void setClassDefOfAnonymousType(const ClassDef *cd) override
bool isDefine() const override
void findSectionsInDocumentation() override
DString m_exception
DString displayDefinition() const override
void setFileDef(FileDef *fd) override
const MemberDef * resolveAlias() const override
Definition memberdef.cpp:66
ArgumentList m_declArgList
std::unique_ptr< MemberDef > deepCopy() const override
void makeForeign() override
MemberDef * m_memDec
uint8_t m_isConstructorCached
bool hasMultiLineInitializer() const override
bool hasCallGraph() const override
void _writeReimplementedBy(OutputList &ol) const
bool isNew() const override
void setMaxInitLines(int lines) override
bool isDocsForDefinition() const override
DString definition() const override
void setEnumClassScope(ClassDef *cd) override
void setReadAccessor(const DString &r) override
bool isUnretained() const override
bool isGettable() const override
MemberGroup * getMemberGroup() const override
bool hasUserDocumentation() const override
std::optional< ArgumentList > formalTemplateArguments() const override
std::map< const Definition *, const MemberList * > m_sectionMap
bool isEnumValue() const override
bool isObjCMethod() const override
MemberDef * memberDefinition() const override
bool m_isTypedefValCached
bool m_hasDocumentedReturnType
DString anchor() const override
StringVector m_qualifiers
void overrideCallGraph(bool e) override
void setInheritsDocsFrom(const MemberDef *md) override
bool addExample(const DString &anchor, const DString &name, const DString &file) override
Specifier virtualness(int count=0) const override
ClassDefMutable * getClassDefMutable() override
bool hasDetailedDescription() const override
void setMemberGroupId(int id) override
DString getReference() const override
bool isCSharpProperty() const override
DString m_groupFileName
void setSectionList(const Definition *container, const MemberList *sl) override
bool isRaisable() const override
void setTemplateMaster(const MemberDef *mt) override
size_t m_declColumn
std::unique_ptr< MemberDef > createTemplateInstanceMember(const ArgumentList &formalArgs, const std::unique_ptr< ArgumentList > &actualArgs) const override
bool m_explicitInherited
const GroupDef * getGroupDef() const override
DString m_enumBaseType
bool isRelatedOrFriend() const override
void insertEnumField(MemberDef *md) override
bool isMutable() const override
bool isPublished() const override
bool isLinkableInProject() const override
bool isProtectedSettable() const override
void setMemberGroup(MemberGroup *grp) override
void setMemberDeclaration(MemberDef *md) override
void setDeclFile(const DString &df, int line, size_t column) override
bool isUNOProperty() const override
bool m_hasDocumentedParams
ModuleDef * m_moduleDef
bool m_hasReferencesRelation
void _computeIsConstructor()
size_t _countReimplementedBy() const
bool isRequired() const override
const MemberDef * m_annMemberForDetails
const MemberVector & reimplementedBy() const override
bool isStrong() const override
bool m_hasInlineSource
void moveDeclArgumentList(std::unique_ptr< ArgumentList > al) override
bool isTypeAlias() const override
void setMemberClass(ClassDef *cd) override
const MemberDef * templateMaster() const override
void setDocsForDefinition(bool b) override
const ClassDef * getCachedTypedefVal() const override
int initializerLines() const override
bool getGroupHasDocs() const override
const MemberDef * getEnumScope() const override
bool m_hasCallerGraph
bool isMaybeDefault() const override
NamespaceDef * m_nspace
bool isReimplementedBy(const ClassDef *cd) const override
StringVector getLabels(const Definition *container) const override
bool isTransient() const override
ArgumentList m_defArgList
bool m_docsForDefinition
DString m_write
MemberDef * memberDeclaration() const override
std::optional< ArgumentList > m_formalTemplateArguments
bool isInitonly() const override
bool isAddable() const override
void setWriteAccessor(const DString &w) override
bool isRelated() const override
void moveArgumentList(std::unique_ptr< ArgumentList > al) override
DString qualifiedName() const override
const ClassDef * m_cachedTypedefValue
MemberDef * m_redefines
void setCategory(ClassDef *) override
void setAnonymousMemberForDetails(const MemberDef *md) override
uint8_t m_isDestructorCached
MemberType memberType() const override
DString sourceRefName() const override
const ClassDef * m_anonymousType
Protection protection() const override
bool isConstructor() const override
void setGroupAlias(const MemberDef *md) override
void setPrototype(bool p, const DString &df, int line, size_t column) override
bool isEnumerate() const override
const ArgumentList & templateArguments() const override
bool isCopy() const override
void setType(const DString &t) override
DString declaration() const override
DString m_metaData
bool isReadonly() const override
void setTagInfo(const TagInfo *i) override
const ArgumentLists & definitionTemplateParameterLists() const override
void _writeTemplatePrefix(OutputList &ol, const Definition *def, const ArgumentList &al, bool writeReqClause=true) const
bool isStatic() const override
void writeTagFile(TextStream &, bool useQualifiedName, bool showNamespaceMembers) const override
ClassDef * m_classDef
void _writeMultiLineInitializer(OutputList &ol, const DString &scopeName) const
MemberDef * resolveAlias() override
Definition memberdef.cpp:65
bool isFinal() const override
bool isAttribute() const override
const MemberDef * m_enumScope
DString m_explicitOutputFileBase
int redefineCount() const override
void setExplicitExternal(bool b, const DString &df, int line, size_t column) override
bool isDictionary() const override
bool isSlot() const override
DString bitfieldString() const override
DString memberTypeName() const override
bool hasInlineSource() const override
void setAnchor() override
Relationship m_related
MemberGroup * m_memberGroup
const MemberDef * m_groupAlias
bool isRetain() const override
MemberVector m_redefinedBy
ClassDef * category() const override
void overrideEnumValues(bool e) override
const MemberDef * anonymousMemberForDetails() const override
bool isDocTransferDone() const override
bool isDocumentedFriendClass() const override
bool isConstEval() const override
bool hasReferencesRelation() const override
void _writeTagData(const DefType) const
void overrideReferencedByRelation(bool e) override
bool isEnumStruct() const override
bool hasEnumValues() const override
DString m_declFileName
bool isExplicit() const override
void _writeCategoryRelation(OutputList &ol) const
void setTemplateSpecialization(bool b) override
bool isTemplateSpecialization() const override
DString typeString() const override
const MemberDef * inheritsDocsFrom() const override
int getDeclLine() const override
void setTypeConstraints(const ArgumentList &al) override
void setVhdlSpecifiers(VhdlSpecifier s) override
bool isImplementation() const override
DString m_extraTypeChars
bool livesInsideEnum() const override
bool isDelete() const override
DString getCachedResolvedTypedef() const override
DString m_bitfields
DString excpString() const override
DString fieldType() const override
bool isNoExcept() const override
DString argsString() const override
bool isWeak() const override
const MemberDef * getAnonymousEnumType() const override
void setDocumentation(const DString &d, const DString &docFile, int docLine, bool stripWhiteSpace=true) override
const ModuleDef * getModuleDef() const override
void setDocTransferDone() override
bool isNoDiscard() const override
GroupDef * m_group
void incrementFlowKeyWordCount() override
const MemberDef * getGroupAlias() const override
bool isConstInit() const override
void setModuleDef(ModuleDef *mod) override
TypeSpecifier m_memSpec
DString getDeclType() const override
TypeSpecifier getMemberSpecifiers() const override
bool hasReferencedByRelation() const override
DString m_requiresClause
void makeImplementationDetail() override
Grouping::GroupPri_t getGroupPri() const override
bool isLinkable() const override
bool hasDocumentation() const override
int numberOfFlowKeyWords() const override
bool isProtectedGettable() const override
bool m_hasDetailedDescriptionCached
MemberDefImpl(const DString &defFileName, int defLine, size_t defColumn, const DString &type, const DString &name, const DString &args, const DString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const DString &metaData)
void setDefinitionTemplateParameterLists(const ArgumentLists &lists) override
ExampleList m_examples
const ArgumentList & declArgumentList() const override
void invalidateCachedArgumentTypes() override
bool _isAnonymousBitField() const
size_t getDeclColumn() const override
void detectUndocumentedParams(bool hasParamCommand, bool hasReturnCommand) const override
ClassDef * m_relatedAlso
const MemberDef * m_annEnumType
bool isWritable() const override
DString m_cachedTypedefTemplSpec
const MemberDef * m_templateMaster
bool isSealed() const override
bool isAbstract() const override
bool isPrivateSettable() const override
void setInitializer(const DString &i) override
bool isSequence() const override
void _computeLinkableInProject()
Grouping::GroupPri_t m_grouppri
void setRelatedAlso(ClassDef *cd) override
const MemberDef * m_annMemberForDecl
void addRequirementReferences(const Definition *) override
bool hasExamples() const override
void resolveUnnamedParameters(const MemberDef *md) override
void setMemberDefinition(MemberDef *md) override
bool isThreadLocal() const override
void writeMemberDocSimple(OutputList &ol, const Definition *container) const override
void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const DString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr) override
bool isSignal() const override
bool isMaybeVoid() const override
void init(Definition *def, const DString &t, const DString &a, const DString &e, Protection p, Specifier v, bool s, Relationship r, MemberType mt, const ArgumentList &tal, const ArgumentList &al, const DString &meta)
void _writeReimplements(OutputList &ol) const
bool isMaybeAmbiguous() const override
bool hasOneLineInitializer() const override
const MemberList * getSectionList(const Definition *) const override
bool isForeign() const override
void addQualifiers(const StringVector &qualifiers) override
void setEnumBaseType(const DString &type) override
bool isAssign() const override
bool isStrongEnumValue() const override
DString getReadAccessor() const override
void _computeIsDestructor()
bool isNotFriend() const override
const ClassDef * getClassDefOfAnonymousType() const override
void copyArgumentNames(const MemberDef *bmd) override
bool isRemovable() const override
void setExplicitInherited(bool b) override
bool isDeleted() const override
DString getGroupFileName() const override
MemberDef * m_memDef
MemberDef * m_groupMember
const DString & initializer() const override
bool isFriend() const override
DString documentation() const override
bool m_livesInsideEnum
void setArgsString(const DString &as) override
ArgumentList m_typeConstraints
ClassDef * relatedAlso() const override
DString m_initializer
void setReimplements(MemberDef *md) override
void writeLink(OutputList &ol, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod, bool onlyText=false) const override
MemberVector m_enumFields
std::unique_ptr< IncludeInfo > m_incInfo
void writeEnumDeclaration(OutputList &typeDecl, const ClassDef *cd, const NamespaceDef *nd, const FileDef *fd, const GroupDef *gd, const ModuleDef *mod) const override
bool isConstExpr() const override
bool isExternal() const override
const FileDef * getFileDef() const override
bool isNonAtomic() const override
const MemberDef * categoryRelation() const override
const MemberVector & enumFieldList() const override
const ClassDef * getClassDef() const override
void setDefinition(const DString &d) override
bool isFunctionOrSignalSlot() const override
void overrideInlineSource(bool e) override
void overrideCallerGraph(bool e) override
bool isPrivateGettable() const override
bool isEvent() const override
void setMemberSpecifiers(TypeSpecifier s) override
bool isFunctionPtr() const override
bool hasCallerGraph() const override
bool isObjCProperty() const override
void setEnumScope(MemberDef *md, bool livesInsideEnum=false) override
bool isPrototype() const override
DString requiresClause() const override
bool isTypedef() const override
void _writeGroupInclude(OutputList &ol, bool inGroup) const
FileDef * m_fileDef
bool hasDocumentedEnumValues() const override
~MemberDefImpl() override=default
void _writeEnumValues(OutputList &ol, const Definition *container, const DString &cfname, const DString &ciname, const DString &cname) const
uint8_t m_isLinkableCached
void setIncludeFile(FileDef *fd, const DString &incName, bool local, bool force) override
bool isVariable() const override
void mergeMemberSpecifiers(TypeSpecifier s) override
DString displayName(bool=true) const override
ArgumentList m_tArgList
bool isConstrained() const override
bool isReadable() const override
DString getOutputFileBase() const override
void addListReference(const Definition *) override
bool isDefault() const override
void _writeCallGraph(OutputList &ol) const
DString briefDescription(bool abbr=false) const override
bool isOverride() const override
const MemberDef * m_docProvider
bool isSettable() const override
bool isBound() const override
CodeSymbolType codeSymbolType() const override
void setBitfields(const DString &s) override
void setInbodyDocumentation(const DString &d, const DString &inbodyFile, int inbodyLine) override
virtual void setMemberDeclaration(MemberDef *md)=0
virtual void setDocTransferDone()=0
virtual void resolveUnnamedParameters(const MemberDef *md)=0
virtual void overrideReferencesRelation(bool e)=0
virtual void overrideReferencedByRelation(bool e)=0
virtual void setDocsForDefinition(bool b)=0
virtual void overrideCallGraph(bool e)=0
virtual void overrideInlineSource(bool e)=0
virtual void overrideEnumValues(bool e)=0
virtual void mergeMemberSpecifiers(TypeSpecifier s)=0
virtual void addQualifiers(const StringVector &qualifiers)=0
virtual void moveDeclArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void overrideCallerGraph(bool e)=0
virtual void setMemberDefinition(MemberDef *md)=0
virtual void moveArgumentList(std::unique_ptr< ArgumentList > al)=0
virtual void insertReimplementedBy(MemberDef *md)=0
virtual void setGroupDef(GroupDef *gd, Grouping::GroupPri_t pri, const DString &fileName, int startLine, bool hasDocs, MemberDef *member=nullptr)=0
A class representing a group of members.
Definition membergroup.h:42
A list of MemberDef objects as shown in documentation sections.
Definition memberlist.h:126
A vector of MemberDef object.
Definition memberlist.h:36
iterator end() noexcept
Definition memberlist.h:57
bool contains(const MemberDef *md) const
Definition memberlist.h:90
void inSort(MemberDef *md)
Definition memberlist.h:81
iterator begin() noexcept
Definition memberlist.h:55
void push_back(const T &value)
Definition memberlist.h:49
An abstract interface of a namespace symbol.
virtual DString compoundTypeString() const =0
void startCodeFragment(const DString &style)
Definition outputlist.h:276
Class representing a list of output generators that are written to in parallel.
Definition outputlist.h:311
void writeDoc(const IDocNodeAST *ast, const Definition *ctx, const MemberDef *md, int sectionLevel=-1)
Definition outputlist.h:379
void endIndent()
Definition outputlist.h:580
void startMemberDeclaration()
Definition outputlist.h:565
void parseText(const DString &textStr)
void endDescTableRow()
Definition outputlist.h:630
void startMemberDocName(bool align)
Definition outputlist.h:676
void endParameterExtra(bool last, bool one, bool bracket)
Definition outputlist.h:690
void writeChar(char c)
Definition outputlist.h:525
void disable(OutputType o)
void startParagraph(const DString &classDef=DString())
Definition outputlist.h:403
void writeObjectLink(const DString &ref, const DString &file, const DString &anchor, const DString &name)
Definition outputlist.h:435
void endMemberDocName()
Definition outputlist.h:678
void endMemberDoc(bool hasArgs)
Definition outputlist.h:531
void startDescTableInit()
Definition outputlist.h:636
void startCallGraph()
Definition outputlist.h:652
void addIndexItem(const DString &s1, const DString &s2)
Definition outputlist.h:586
void endDescTable()
Definition outputlist.h:626
void startParameterExtra()
Definition outputlist.h:688
void endPageRef(const DString &c, const DString &a)
Definition outputlist.h:596
const OutputCodeList & codeGenerators() const
Definition outputlist.h:354
void startParameterList(bool openBracket)
Definition outputlist.h:696
void writeLatexSpacing()
Definition outputlist.h:541
void enable(OutputType o)
void endInlineMemberType()
Definition outputlist.h:724
void endMemberDescription()
Definition outputlist.h:563
void endMemberDeclaration(const DString &anchor, const DString &inheritId)
Definition outputlist.h:567
void startInlineMemberType()
Definition outputlist.h:722
void docify(const DString &s)
Definition outputlist.h:433
void startInlineMemberDoc()
Definition outputlist.h:730
void endMemberTemplateParams(const DString &anchor, const DString &inheritId)
Definition outputlist.h:495
void lineBreak(const DString &style=DString())
Definition outputlist.h:555
void startMemberDoc(const DString &clName, const DString &memName, const DString &anchor, const DString &title, int memCount, int memTotal, bool showInline)
Definition outputlist.h:527
void endDescTableTitle()
Definition outputlist.h:634
void insertMemberAlign(bool templ=false)
Definition outputlist.h:513
void startIndent()
Definition outputlist.h:578
void writeString(const DString &text)
Definition outputlist.h:407
void endDescForItem()
Definition outputlist.h:545
void endExamples()
Definition outputlist.h:576
void endDoxyAnchor(const DString &fn, const DString &anchor)
Definition outputlist.h:537
void startDescTable(const DString &title, const bool hasInits)
Definition outputlist.h:624
void endParagraph()
Definition outputlist.h:405
void endDescTableData()
Definition outputlist.h:642
void disableAll()
void startDescTableTitle()
Definition outputlist.h:632
void startPageRef()
Definition outputlist.h:594
void startExamples()
Definition outputlist.h:574
void endInlineMemberDoc()
Definition outputlist.h:732
void endMemberDocPrefixItem()
Definition outputlist.h:674
void startParameterDefVal(const char *separator)
Definition outputlist.h:692
void startAnonTypeScope(int i1)
Definition outputlist.h:485
void addLabel(const DString &fName, const DString &anchor)
Definition outputlist.h:539
void startBold()
Definition outputlist.h:557
void endMemberItem(OutputGenerator::MemberItemType type)
Definition outputlist.h:491
void startTypewriter()
Definition outputlist.h:445
void startDescTableData()
Definition outputlist.h:640
void pushGeneratorState()
void startDescForItem()
Definition outputlist.h:543
void endParameterDefVal()
Definition outputlist.h:694
void disableAllBut(OutputType o)
void exceptionEntry(const DString &prefix, bool closeBracket)
Definition outputlist.h:700
void endParameterName()
Definition outputlist.h:686
void popGeneratorState()
void endBold()
Definition outputlist.h:559
void writeLabel(const DString &l, bool isLast)
Definition outputlist.h:736
void endLabels()
Definition outputlist.h:738
void startMemberItem(const DString &anchor, OutputGenerator::MemberItemType type, const DString &id=DString())
Definition outputlist.h:489
void startMemberDescription(const DString &anchor, const DString &inheritId=DString(), bool typ=false)
Definition outputlist.h:561
void endParameterList()
Definition outputlist.h:698
void endCallGraph(DotCallGraph &g)
Definition outputlist.h:654
void startInlineMemberName()
Definition outputlist.h:726
void generateDoc(const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &docStr, const DocOptions &options)
void startLabels()
Definition outputlist.h:734
void endParameterType()
Definition outputlist.h:682
void startMemberDocPrefixItem()
Definition outputlist.h:672
void endAnonTypeScope(int i1)
Definition outputlist.h:487
void startParameterName(bool one)
Definition outputlist.h:684
void enableAll()
void startParameterType(bool first, const DString &key)
Definition outputlist.h:680
void endTypewriter()
Definition outputlist.h:447
void endInlineMemberName()
Definition outputlist.h:728
void writeNonBreakableSpace(int num)
Definition outputlist.h:622
void startDoxyAnchor(const DString &fName, const DString &manName, const DString &anchor, const DString &name, const DString &args)
Definition outputlist.h:533
void endDescTableInit()
Definition outputlist.h:638
void startDescTableRow()
Definition outputlist.h:628
void startMemberTemplateParams()
Definition outputlist.h:493
std::unique_ptr< CodeParserInterface > getCodeParser(const DString &extension)
Gets the interface to the parser associated with a given extension.
Definition parserintf.h:253
static RequirementManager & instance()
void addRequirementRefsForSymbol(const Definition *symbol)
This struct is used to capture the tag file information for an Entry.
Definition entry.h:101
DString tagName
Definition entry.h:103
DString anchor
Definition entry.h:105
DString fileName
Definition entry.h:104
Implements TextGeneratorIntf for an OutputDocInterface stream.
Definition outputlist.h:786
Text streaming class that buffers data.
Definition textstream.h:36
virtual DString trProvidedByCategory()=0
virtual DString trReimplementedFromList(int numEntries)=0
virtual DString trDefineValue()=0
virtual DString trSubprogram(bool first_capital, bool singular)=0
virtual DString trImplementedInList(int numEntries)=0
virtual DString trInitialValue()=0
virtual DString trImplementedFromList(int numEntries)=0
virtual DString trVhdlType(VhdlSpecifier type, bool single)=0
virtual DString trPageAbbreviation()=0
virtual DString trReimplementedInList(int numEntries)=0
virtual DString trExtendsClass()=0
virtual DString trCallerGraph()=0
virtual DString trMember(bool first_capital, bool singular)=0
virtual DString trEnumerationValues()=0
virtual DString trCallGraph()=0
virtual DString trGlobal(bool first_capital, bool singular)=0
Wrapper class for a number of boolean properties.
Definition types.h:694
static bool writeVHDLTypeDocumentation(const MemberDef *mdef, const Definition *d, OutputList &ol)
static bool isMisc(const MemberDef *mdef)
static void writeSource(const MemberDef *mdef, OutputList &ol, const DString &cname)
ClassDefMutable * toClassDefMutable(Definition *d)
ClassDef * getClass(const DString &n)
ClassDef * toClassDef(Definition *d)
Class representing a regular expression.
Definition regex.h:39
Object representing the matching results.
Definition regex.h:154
SubMatch prefix() const
Return the part of the string before the match.
Definition regex.h:169
size_t position() const
Returns the position of the match or std::string::npos if no position is set.
Definition regex.h:160
SubMatch suffix() const
Return the part of the string after the match.
Definition regex.h:172
size_t length() const
Returns the position of the match or std::string::npos if no length is set.
Definition regex.h:163
std::string str() const
Returns the matching part as a string.
Definition regex.h:132
#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 NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
std::vector< std::string > StringVector
Definition containers.h:33
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
Definition defargs.l:821
Definition * toDefinition(DefinitionMutable *dm)
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:54
#define AUTO_TRACE(...)
Definition docnode.cpp:53
IDocParserPtr createDocParser()
factory function to create a parser
Definition docparser.cpp:59
void docFindSections(const DString &input, const Definition *d, const DString &fileName)
IDocNodeASTPtr validatingParseDoc(IDocParser &parserIntf, const DString &fileName, int startLine, const Definition *ctx, const MemberDef *md, const DString &input, const DocOptions &options)
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
Definition dstring.cpp:485
bool isId(char c)
Returns true if c is a valid character for an identifier.
Definition dstring.h:895
DString includeClose(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:82
DString includeOpen(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:69
FileDef * toFileDef(Definition *d)
Definition filedef.cpp:2033
DString includeStatement(SrcLangExt lang, IncludeKind kind)
Definition filedef.cpp:52
@ IncludeLocal
Definition filedef.h:47
@ IncludeSystem
Definition filedef.h:46
GroupDef * toGroupDef(Definition *d)
Translator * theTranslator
Definition language.cpp:76
void linkifyText(const TextGeneratorIntf &out, const DString &text, const LinkifyTextOptions &options)
DString md5str(const std::string_view &str)
Definition md5hash.h:33
static DString simplifyTypeForTable(const DString &s)
static DString addTemplateNames(const DString &s, const DString &n, const DString &t)
static void writeExceptionListImpl(OutputList &ol, const ClassDef *cd, const MemberDef *md, DString const &exception)
static void writeExceptionList(OutputList &ol, const ClassDef *cd, const MemberDef *md)
static void writePageRef(OutputList &ol, const DString &cn, const DString &mn)
static DString combineArgsAndException(DString args, DString exception)
static bool writeDefArgumentList(OutputList &ol, const Definition *scope, const MemberDef *md)
static std::mutex g_hasDetailedDescriptionMutex
std::unique_ptr< MemberDef > createMemberDef(const DString &defFileName, int defLine, size_t defColumn, const DString &type, const DString &name, const DString &args, const DString &excp, Protection prot, Specifier virt, bool stat, Relationship related, MemberType t, const ArgumentList &tal, const ArgumentList &al, const DString &metaData)
Factory method to create a new instance of a MemberDef.
static std::mutex g_docCrossReferenceMutex
std::unique_ptr< MemberDef > createMemberDefAlias(const Definition *newScope, const MemberDef *aliasMd)
static void invalidateCachedTypesInArgumentList(ArgumentList &al)
static std::mutex g_detectUndocumentedParamsMutex
static void transferArgumentDocumentation(ArgumentList &decAl, ArgumentList &defAl)
void addDocCrossReference(const MemberDef *s, const MemberDef *d)
MemberDefMutable * toMemberDefMutable(Definition *d)
void mergeMemberOverrideOptions(MemberDefMutable *md1, MemberDefMutable *md2)
static DString stripTrailingReturn(const DString &trailRet)
void combineDeclarationAndDefinition(MemberDefMutable *mdec, MemberDefMutable *mdef)
MemberDef * toMemberDef(Definition *d)
static const reg::Ex reAnonymous(R"([\w:@]*@\d+)")
#define warn_undoc(file, line, fmt,...)
Definition message.h:102
#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
#define ASSERT(x)
Definition message.h:142
#define warn_doc_error(file, line, fmt,...)
Definition message.h:112
ModuleDef * toModuleDef(Definition *d)
NamespaceDef * toNamespaceDef(Definition *d)
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
Definition regex.cpp:850
void addRefItem(const RefItemVector &sli, const DString &key, const DString &prefix, const DString &name, const DString &title, const DString &args, const Definition *scope)
Definition reflist.h:136
std::vector< RefItem * > RefItemVector
Definition reflist.h:134
std::string_view stripWhiteSpace(std::string_view s)
Given a string view s, returns a new, narrower view on that string, skipping over any leading or trai...
Definition stringutil.h:75
Options to configure the code parser.
Definition parserintf.h:77
Helper class to pass options when calling OutputList::generateDoc().
Definition docoptions.h:24
Data associated with an example.
Definition example.h:29
GroupPri_t
Grouping priority.
Definition types.h:230
@ GROUPING_AUTO_DEF
membership in group was defined via @defgroup
Definition types.h:234
LinkifyTextOptions & setScope(const Definition *scope)
Definition linkifytext.h:58
LinkifyTextOptions & setSelf(const Definition *self)
Definition linkifytext.h:64
LinkifyTextOptions & setFileScope(const FileDef *fileScope)
Definition linkifytext.h:61
CodeSymbolType
Definition types.h:481
MemberType
Definition types.h:569
MemberListContainer
Definition types.h:472
bool isTypeAClassFriend(const DString &type)
Definition types.h:920
Protection
Definition types.h:32
SrcLangExt
Definition types.h:207
Relationship
Definition types.h:167
Specifier
Definition types.h:80
VhdlSpecifier
Definition types.h:770
DString stripExtension(const DString &fName)
Definition util.cpp:3956
DString substituteTemplateArgumentsInString(const DString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
Definition util.cpp:3525
DString inlineArgListToDoc(const ArgumentList &al)
Definition util.cpp:4866
bool protectionLevelVisible(Protection prot)
Definition util.cpp:4672
DString stripFromIncludePath(const DString &path)
Definition util.cpp:227
DString detab(const DString &s, size_t &refIndent)
Definition util.cpp:5195
void stripIndentationVerbatim(DString &doc, size_t indentationLevel, bool skipFirstLine)
Definition util.cpp:4773
void writeTypeConstraints(OutputList &ol, const Definition *d, const ArgumentList &al)
Definition util.cpp:4284
DString removeRedundantWhiteSpace(const DString &s)
Definition util.cpp:426
DString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
Definition util.cpp:903
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
Definition util.cpp:4169
bool matchArguments2(const Definition *srcScope, const FileDef *srcFileScope, const DString &srcReturnType, const ArgumentList *srcAl, const Definition *dstScope, const FileDef *dstFileScope, const DString &dstReturnType, const ArgumentList *dstAl, bool checkCV, SrcLangExt lang)
Definition util.cpp:1589
void addHtmlExtensionIfMissing(DString &fName)
Definition util.cpp:3932
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
Definition util.cpp:3233
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Definition util.cpp:4630
DString removeAnonymousScopes(const DString &str)
Definition util.cpp:98
void writeMarkerList(OutputList &ol, const std::string &markerText, size_t numMarkers, std::function< void(size_t)> replaceFunc)
Definition util.cpp:753
DString inlineTemplateArgListToDoc(const ArgumentList &al)
Definition util.cpp:832
void writeExamples(OutputList &ol, const ExampleList &list)
Definition util.cpp:804
A bunch of utility functions.