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 (isInitonly()) sl.emplace_back("init");
2528 if (extractPrivate)
2529 {
2530 if (isPrivateGettable()) sl.emplace_back("private get");
2531 if (isPrivateSettable()) sl.emplace_back("private set");
2532 }
2533 bool first=true;
2534 for (const auto &s : sl)
2535 {
2536 if (!first)
2537 {
2538 ol.docify(", ");
2539 }
2540 first=false;
2541 ol.docify(s);
2542 }
2543 ol.docify("]");
2544 ol.endTypewriter();
2545 }
2546
2547 if (isEvent() && (isAddable() || isRemovable() || isRaisable()))
2548 {
2549 ol.writeLatexSpacing();
2550 ol.startTypewriter();
2551 ol.docify(" [");
2552 StringVector sl;
2553 if (isAddable()) sl.emplace_back("add");
2554 if (isRemovable()) sl.emplace_back("remove");
2555 if (isRaisable()) sl.emplace_back("raise");
2556 bool first=true;
2557 for (const auto &s : sl)
2558 {
2559 if (!first)
2560 {
2561 ol.docify(", ");
2562 }
2563 first=false;
2564 ol.docify(s);
2565 }
2566 ol.docify("]");
2567 ol.endTypewriter();
2568 }
2569
2570 if (writeAnchor)
2571 {
2572 ol.endDoxyAnchor(cfname,anchor());
2573 }
2574
2575 //printf("endMember %s annoClassDef=%p annEnumType=%p\n",
2576 // qPrint(name()),annoClassDef,annEnumType);
2577 ol.endMemberItem(anonType);
2578 if (endAnonScopeNeeded)
2579 {
2580 ol.endAnonTypeScope(indentLevel);
2581 }
2582
2583 // write brief description
2584 if (!briefDescription().empty() &&
2585 Config_getBool(BRIEF_MEMBER_DESC)
2586 )
2587 {
2588 auto parser { createDocParser() };
2589 auto ast { validatingParseDoc(*parser.get(),
2590 briefFile(),
2591 briefLine(),
2593 this,
2595 DocOptions()
2596 .setIndexWords(inheritedFrom==nullptr)
2597 .setSingleLine(true))
2598 };
2599 if (!ast->empty())
2600 {
2601 ol.startMemberDescription(anchor(),inheritId);
2602 ol.writeDoc(ast.get(),getOuterScope()?getOuterScope():d,this);
2603 if (detailsVisible) // add More.. link only when both brief and details are visible
2604 {
2605 if (!isAnonymous()) // hide anonymous stuff
2606 {
2607 ol.pushGeneratorState();
2609 ol.docify(" ");
2610 ol.popGeneratorState();
2611 }
2612 }
2613 // for RTF we need to add an extra empty paragraph
2614 ol.pushGeneratorState();
2616 ol.startParagraph();
2617 ol.endParagraph();
2618 ol.popGeneratorState();
2620 }
2621 }
2622
2623 ol.endMemberDeclaration(anchor(),inheritId);
2624
2626 //printf("< %s MemberDefImpl::writeDeclaration() inGroup=%d\n",qPrint(qualifiedName()),inGroup);
2627}
2628
2630
2632{
2633 std::lock_guard<std::mutex> lock(g_hasDetailedDescriptionMutex);
2634 //printf(">hasDetailedDescription(cached=%d)\n",m_hasDetailedDescriptionCached);
2636 {
2637 bool extractAll = Config_getBool(EXTRACT_ALL);
2638 bool alwaysDetailedSec = Config_getBool(ALWAYS_DETAILED_SEC);
2639 bool repeatBrief = Config_getBool(REPEAT_BRIEF);
2640 bool briefMemberDesc = Config_getBool(BRIEF_MEMBER_DESC);
2641 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
2642 bool extractStatic = Config_getBool(EXTRACT_STATIC);
2643 bool extractPrivateVirtual = Config_getBool(EXTRACT_PRIV_VIRTUAL);
2644 bool inlineSources = hasInlineSource();
2645 bool includes = Config_getBool(SHOW_INCLUDE_FILES) && m_incInfo!=nullptr;
2646
2647 // the member has detailed documentation because the user added some comments
2648 bool docFilter =
2649 // extract all is enabled
2650 extractAll ||
2651 // has detailed docs
2652 !documentation().empty() ||
2653 // has inbody docs
2655 // is an enum with values that are documented
2657 // is documented enum value
2658 (m_mtype==MemberType::EnumValue && !briefDescription().empty()) ||
2659 // has brief description that is part of the detailed description
2660 (!briefDescription().empty() && // has brief docs
2661 (alwaysDetailedSec && // they are visible in
2662 (repeatBrief || // detailed section or
2663 !briefMemberDesc // they are explicitly not
2664 ) // shown in brief section
2665 )
2666 ) ||
2667 // has one or more documented arguments
2672 m_templateMaster->templateArguments().hasTemplateDocumentation() :
2674 // user-specified qualifiers
2675 !m_qualifiers.empty();
2676
2677 // generate function guard
2678 // ================== =======
2679 // _writeGroupInclude -> ignored in calculation
2680 // multiLineInitializer() -> hasMultiLineInitializer()
2681 // _writeReimplements -> _isReimplements()
2682 // _writeReimplementedBy -> _countReimplementedBy()>0
2683 // _writeExamples -> hasExamples()
2684 // _writeTypeConstraints -> m_typeConstraints.hasParameters()
2685 // writeSourceDef -> !getSourceFileBase().empty();
2686 // writeInlineCode -> hasInlineSource() && hasSources()
2687 // writeSourceRefs -> hasReferencesRelation() && hasSourceRefs()
2688 // writeSourceReffedBy -> hasReferencedByRelation() && hasSourceReffedBy()
2689 // _writeCallGraph -> _hasVisibleCallGraph()
2690 // _writeCallerGraph -> _hasVisibleCallerGraph()
2691
2692 // the member has detailed documentation because there is some generated info
2693 bool docInfo =
2694 // has a multi-line initialization block
2696 // reimplements / reimplemented by
2698 // examples
2699 hasExamples() ||
2700 // type constraints
2702 // has source definition
2703 !getSourceFileBase().empty() ||
2704 // has inline sources
2705 (inlineSources && hasSources()) ||
2706 // has references
2709 // call graph
2711 // caller graph
2713 // requirement references
2715 // has \headerfile command
2716 includes;
2717
2718 if (!hideUndocMembers) // if HIDE_UNDOC_MEMBERS is NO we also show the detailed section
2719 // if there is only some generated info
2720 {
2721 docFilter = docFilter || docInfo;
2722 }
2723
2724 // this is not a global static or global statics should be extracted
2725 bool staticFilter = getClassDef()!=nullptr || !isStatic() || extractStatic;
2726
2727 // a module does not contain details for members, so either the namespace or file should be linkable
2728 bool moduleFilter = getModuleDef()==nullptr || (getFileDef() && getFileDef()->isLinkable()) ||
2731
2732 // only include members that are non-private unless EXTRACT_PRIVATE is
2733 // set to YES or the member is part of a group
2734 bool privateFilter = protectionLevelVisible(protection()) || m_mtype==MemberType::Friend ||
2735 (m_prot==Protection::Private && (m_virt!=Specifier::Normal || isOverride() || isFinal()) && extractPrivateVirtual);
2736
2737 // hide friend (class|struct|union) member if HIDE_FRIEND_COMPOUNDS
2738 // is true
2739 bool friendCompoundFilter = !(Config_getBool(HIDE_FRIEND_COMPOUNDS) && isFriend());
2740
2742 (docFilter && staticFilter && moduleFilter && privateFilter && friendCompoundFilter && !isHidden());
2743 //printf("docFilter=%d docInfo=%d staticFilter=%d privateFilter=%d friendCompoundFilter=%d !isHidden()=%d",
2744 // docFilter,docInfo,staticFilter,privateFilter,friendCompoundFilter,!isHidden());
2746 }
2747 //printf("<hasDetailedDescription(cached=%d)\n",m_hasDetailedDescriptionCached);
2749}
2750
2752{
2753 bool separateMemPages = Config_getBool(SEPARATE_MEMBER_PAGES);
2754 bool inlineSimpleStructs = Config_getBool(INLINE_SIMPLE_STRUCTS);
2755 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
2756 bool groupFilter = getGroupDef()==nullptr || container==MemberListContainer::Group || separateMemPages;
2757 bool fileFilter = getNamespaceDef()==nullptr || !getNamespaceDef()->isLinkable() || container!=MemberListContainer::File;
2758 bool simpleFilter = (hasBriefDescription() || !hideUndocMembers) && inlineSimpleStructs &&
2759 getClassDef()!=nullptr && getClassDef()->isSimple();
2760
2761 bool visible = hasDetailedDescription() && groupFilter && fileFilter &&
2762 !isReference();
2763 bool result = visible || simpleFilter;
2764 //printf("%s::isDetailedSectionVisible: %d groupFilter=%d fileFilter=%d\n",
2765 // qPrint(name()),result,groupFilter,fileFilter);
2766 return result;
2767}
2768
2770{
2771 StringVector sl;
2772 bool inlineInfo = Config_getBool(INLINE_INFO);
2773 bool inherited = getClassDef() &&
2774 (getClassDef()!=container || m_explicitInherited) &&
2775 container->definitionType()==TypeClass &&
2776 !isRelated();
2777 Specifier lvirt=virtualness();
2778 if ((!isObjCMethod() || isOptional() || isRequired()) &&
2779 (protection()!=Protection::Public || lvirt!=Specifier::Normal ||
2780 isFriend() || isRelated() ||
2781 (isInline() && inlineInfo) ||
2782 isSignal() || isSlot() ||
2783 isStatic() || isExternal() ||
2784 isExported() ||
2785 inherited ||
2786 TypeSpecifier(m_memSpec).setInline(false)!=TypeSpecifier()
2787 )
2788 )
2789 {
2790 // write the member specifier list
2791 //ol.writeLatexSpacing();
2792 //ol.startTypewriter();
2793 //ol.docify(" [");
2794 SrcLangExt lang = getLanguage();
2795 bool optVhdl = lang==SrcLangExt::VHDL;
2796 bool extractPrivate = Config_getBool(EXTRACT_PRIVATE);
2797 if (optVhdl)
2798 {
2799 sl.push_back(theTranslator->trVhdlType(getVhdlSpecifiers(),true).str());
2800 }
2801 else
2802 {
2803 if (isFriend()) sl.emplace_back("friend");
2804 else if (isRelated()) sl.emplace_back("related");
2805 else
2806 {
2807 if (isExternal()) sl.emplace_back("extern");
2808 if (inlineInfo && isInline()) sl.emplace_back("inline");
2809 if (isExplicit()) sl.emplace_back("explicit");
2810 if (isMutable()) sl.emplace_back("mutable");
2811 if (isThreadLocal()) sl.emplace_back("thread_local");
2812 if (isStatic()) sl.emplace_back("static");
2813 if (isGettable()) sl.emplace_back("get");
2814 if (isProtectedGettable()) sl.emplace_back("protected get");
2815 if (isSettable()) sl.emplace_back("set");
2816 if (isProtectedSettable()) sl.emplace_back("protected set");
2817 if (isProperty() && isInitonly()) sl.emplace_back("init");
2818 if (extractPrivate)
2819 {
2820 if (isPrivateGettable()) sl.emplace_back("private get");
2821 if (isPrivateSettable()) sl.emplace_back("private set");
2822 }
2823 if (isNoDiscard()) sl.emplace_back("nodiscard");
2824 if (isConstExpr()) sl.emplace_back("constexpr");
2825 if (isConstEval()) sl.emplace_back("consteval");
2826 if (isConstInit()) sl.emplace_back("constinit");
2827 if (isAddable()) sl.emplace_back("add");
2828 if (!isUNOProperty() && isRemovable()) sl.emplace_back("remove");
2829 if (isRaisable()) sl.emplace_back("raise");
2830 if (isReadable()) sl.emplace_back("read");
2831 if (isWritable()) sl.emplace_back("write");
2832 if (isFinal()) sl.emplace_back("final");
2833 if (isAbstract()) sl.emplace_back("abstract");
2834 if (isOverride()) sl.emplace_back("override");
2835 if (!isProperty() && isInitonly()) sl.emplace_back("initonly");
2836 if (isSealed()) sl.emplace_back("sealed");
2837 if (isNew()) sl.emplace_back("new");
2838 if (isOptional()) sl.emplace_back("optional");
2839 if (isRequired()) sl.emplace_back("required");
2840 if (isExported()) sl.emplace_back("export");
2841
2842 if (isNonAtomic()) sl.emplace_back("nonatomic");
2843 else if (isObjCProperty()) sl.emplace_back("atomic");
2844
2845 // mutual exclusive Objective 2.0 property attributes
2846 if (isAssign()) sl.emplace_back("assign");
2847 else if (isCopy()) sl.emplace_back("copy");
2848 else if (isRetain()) sl.emplace_back("retain");
2849 else if (isWeak()) sl.emplace_back("weak");
2850 else if (lang!=SrcLangExt::CSharp && isStrong()) sl.emplace_back("strong");
2851 else if (isUnretained()) sl.emplace_back("unsafe_unretained");
2852
2853 if (!isObjCMethod())
2854 {
2855 if (protection()==Protection::Protected) sl.emplace_back("protected");
2856 else if (protection()==Protection::Private) sl.emplace_back("private");
2857 else if (protection()==Protection::Package) sl.emplace_back("package");
2858
2859 if (lvirt==Specifier::Virtual) sl.emplace_back("virtual");
2860 else if (lvirt==Specifier::Pure) sl.emplace_back("pure virtual");
2861 if (isSignal()) sl.emplace_back("signal");
2862 if (isSlot()) sl.emplace_back("slot");
2863 if (isDefault()) sl.emplace_back("default");
2864 if (isDelete()) sl.emplace_back("delete");
2865 if (isNoExcept()) sl.emplace_back("noexcept");
2866 if (isAttribute()) sl.emplace_back("attribute");
2867 if (isUNOProperty()) sl.emplace_back("property");
2868 if (isReadonly()) sl.emplace_back("readonly");
2869 if (isBound()) sl.emplace_back("bound");
2870 if (isUNOProperty() && isRemovable()) sl.emplace_back("removable");
2871 if (isConstrained()) sl.emplace_back("constrained");
2872 if (isTransient()) sl.emplace_back("transient");
2873 if (isMaybeVoid()) sl.emplace_back("maybevoid");
2874 if (isMaybeDefault()) sl.emplace_back("maybedefault");
2875 if (isMaybeAmbiguous()) sl.emplace_back("maybeambiguous");
2876 if (isPublished()) sl.emplace_back("published"); // enum
2877 }
2879 {
2880 sl.emplace_back("implementation");
2881 }
2882 }
2883 if (inherited)
2884 {
2885 sl.emplace_back("inherited");
2886 }
2887 }
2888 }
2889 else if (isObjCMethod() && isImplementation())
2890 {
2891 sl.emplace_back("implementation");
2892 }
2893
2894 for (const auto &sx : m_qualifiers)
2895 {
2896 bool alreadyAdded = std::find(sl.begin(), sl.end(), sx) != sl.end();
2897 if (!alreadyAdded)
2898 {
2899 sl.push_back(sx);
2900 }
2901 }
2902
2903 return sl;
2904}
2905
2907{
2908 // write call graph
2910 {
2911 DotCallGraph callGraph(this,false);
2912 if (callGraph.isTooBig())
2913 {
2914 warn_uncond("Call graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
2915 qualifiedName(), callGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
2916 }
2917 else if (!callGraph.isTrivial())
2918 {
2919 msg("Generating call graph for function {}\n",qualifiedName());
2921 ol.startCallGraph();
2923 ol.endCallGraph(callGraph);
2924 ol.enableAll();
2925 }
2926 }
2927}
2928
2930{
2932 {
2933 DotCallGraph callerGraph(this, true);
2934 if (callerGraph.isTooBig())
2935 {
2936 warn_uncond("Caller graph for '{}' not generated, too many nodes ({}), threshold is {}. Consider increasing DOT_GRAPH_MAX_NODES.\n",
2937 qualifiedName(), callerGraph.numNodes(), Config_getInt(DOT_GRAPH_MAX_NODES));
2938 }
2939 else if (!callerGraph.isTrivial())
2940 {
2941 msg("Generating caller graph for function {}\n",qualifiedName());
2943 ol.startCallGraph();
2945 ol.endCallGraph(callerGraph);
2946 ol.enableAll();
2947 }
2948 }
2949}
2950
2952{
2953 const MemberDef *bmd=reimplements();
2954 const ClassDef *bcd=nullptr;
2955 if (bmd && (bcd=bmd->getClassDef()))
2956 {
2957 // write class that contains a member that is reimplemented by this one
2958 if (bcd->isLinkable())
2959 {
2960 return true;
2961 }
2962 }
2963 return false;
2964}
2966{
2967 const MemberDef *bmd=reimplements();
2968 const ClassDef *bcd=nullptr;
2969 if (bmd && (bcd=bmd->getClassDef()))
2970 {
2971 // write class that contains a member that is reimplemented by this one
2972 if (bcd->isLinkable())
2973 {
2974 ol.startParagraph();
2975 DString reimplFromLine;
2976 if (bmd->virtualness()!=Specifier::Pure && bcd->compoundType()!=ClassDef::Interface)
2977 {
2978 reimplFromLine = theTranslator->trReimplementedFromList(1);
2979 }
2980 else
2981 {
2982 reimplFromLine = theTranslator->trImplementedFromList(1);
2983 }
2984 if (size_t markerPos = reimplFromLine.find("@0"); markerPos!=DString::npos) // should always pass this.
2985 {
2986 ol.parseText(reimplFromLine.left(markerPos)); //text left from marker
2987 if (bmd->isLinkable()) // replace marker with link
2988 {
2989 //Definition *bd=bmd->group;
2990 //if (bd==0) bd=bcd;
2992 bmd->anchor(),bcd->displayName());
2993
2994 //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
2995 // bmd->anchor(),bcd->name());
2996 if ( bmd->isLinkableInProject() )
2997 {
2998 writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
2999 }
3000 }
3001 else
3002 {
3004 DString(),bcd->displayName());
3005 if (bcd->isLinkableInProject()/* && !Config_getBool(PDF_HYPERLINKS)*/ )
3006 {
3007 writePageRef(ol,bcd->getOutputFileBase(),bcd->anchor());
3008 }
3009 }
3010 ol.parseText(reimplFromLine.right(
3011 reimplFromLine.length()-markerPos-2)); // text right from marker
3012
3013 }
3014 else
3015 {
3016 err("translation error: no marker in trReimplementsFromList()\n");
3017 }
3018 ol.endParagraph();
3019 }
3020 }
3021}
3022
3024{
3025 const MemberVector &bml=reimplementedBy();
3026 size_t count=0;
3027 for (const auto &bmd : bml)
3028 {
3029 const ClassDef *bcd=bmd->getClassDef();
3030 // count the members that directly inherit from md and for
3031 // which the member and class are visible in the docs.
3032 if ( bcd && bmd->isLinkable() && bcd->isLinkable() )
3033 {
3034 count++;
3035 }
3036 }
3037 return count;
3038}
3039
3041{
3042 const MemberVector &bml=reimplementedBy();
3043 size_t count = _countReimplementedBy();
3044 if (count>0)
3045 {
3046 auto replaceFunc = [&bml,&ol](size_t entryIndex)
3047 {
3048 size_t cnt=0;
3049 auto it = bml.begin();
3050 // find the entryIndex-th documented entry in the inheritance list.
3051 const MemberDef *bmd = nullptr;
3052 const ClassDef *bcd = nullptr;
3053 while (it!=bml.end())
3054 {
3055 bmd = *it;
3056 bcd = bmd->getClassDef();
3057 if ( bmd->isLinkable() && bcd->isLinkable())
3058 {
3059 if (cnt==entryIndex) break;
3060 cnt++;
3061 }
3062 ++it;
3063 }
3064
3065 if (bcd && bmd) // write link for marker
3066 {
3067 //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
3068 // bmd->anchor(),bcd->name());
3070 bmd->anchor(),bcd->displayName());
3071
3072 if (bmd->isLinkableInProject() )
3073 {
3074 writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
3075 }
3076 }
3077 };
3078
3079 DString reimplInLine;
3080 if (m_virt==Specifier::Pure || (getClassDef() && getClassDef()->compoundType()==ClassDef::Interface))
3081 {
3082 reimplInLine = theTranslator->trImplementedInList(static_cast<int>(count));
3083 }
3084 else
3085 {
3086 reimplInLine = theTranslator->trReimplementedInList(static_cast<int>(count));
3087 }
3088
3089 // write the list of classes that overwrite this member
3090 ol.startParagraph();
3091 writeMarkerList(ol,
3092 reimplInLine.str(),
3093 count,
3094 replaceFunc);
3095 ol.endParagraph();
3096 }
3097}
3098
3100{
3101 if (getClassDef()) // this should be a member of a class/category
3102 {
3103 //printf("%s: category %s relation %s class=%s categoryOf=%s\n",
3104 // qPrint(name()),
3105 // m_category ? qPrint(m_category->name()) : "<none>",
3106 // m_categoryRelation ? qPrint(m_categoryRelation->name()) : "<none>",
3107 // qPrint(m_classDef->name()),
3108 // m_classDef->categoryOf() ? qPrint(m_classDef->categoryOf()->name()) : "<none>"
3109 // );
3110 DString text;
3111 DString ref;
3112 DString file;
3113 DString anc;
3114 DString name;
3115 size_t i=DString::npos;
3117 {
3118 if (m_category)
3119 {
3120 // this member is in a normal class and implements method categoryRelation from category
3121 // so link to method 'categoryRelation' with 'provided by category 'category' text.
3124 }
3125 else if (getClassDef()->categoryOf())
3126 {
3127 // this member is part of a category so link to the corresponding class member of the class we extend
3128 // so link to method 'categoryRelation' with 'extends class 'classDef->categoryOf()'
3129 text = theTranslator->trExtendsClass();
3131 }
3132 i=text.find("@0");
3133 if (i!=DString::npos)
3134 {
3135 const MemberDef *md = m_categoryRelation;
3136 ref = md->getReference();
3137 file = md->getOutputFileBase();
3138 anc = md->anchor();
3139 }
3140 }
3141 if (i!=DString::npos && !name.empty())
3142 {
3143 ol.startParagraph();
3144 ol.parseText(text.left(i));
3145 ol.writeObjectLink(ref,file,anc,name);
3146 ol.parseText(text.mid(i+2));
3147 ol.endParagraph();
3148 }
3149 }
3150}
3151
3153{
3154 // write the list of examples that use this member
3155 if (hasExamples())
3156 {
3157 ol.startExamples();
3158 ol.startDescForItem();
3160 ol.endDescForItem();
3161 ol.endExamples();
3162 }
3163}
3164
3172
3174 const DString &cfname,const DString &ciname,
3175 const DString &cname) const
3176{
3177 // For enum, we also write the documented enum values
3178 if (isEnumerate())
3179 {
3180 bool first=true;
3181 //printf("** %s: enum values=%zu\n",qPrint(name()),enumFieldList().size());
3182 bool hasInits = false;
3183 if (hasEnumValues())
3184 {
3185 for (const auto &fmd : enumFieldList())
3186 {
3187 if (fmd->isLinkable())
3188 {
3189 if (!fmd->initializer().empty())
3190 {
3191 hasInits = true;
3192 break;
3193 }
3194 }
3195 }
3196 }
3197 for (const auto &fmd : enumFieldList())
3198 {
3199 //printf("Enum %p: isLinkable()=%d\n",fmd,fmd->isLinkable());
3200 if (fmd->isLinkable())
3201 {
3202 if (first)
3203 {
3205 first=false;
3206 }
3207
3208 ol.startDescTableRow();
3209 ol.addIndexItem(fmd->name(),ciname);
3210 ol.addIndexItem(ciname,fmd->name());
3211
3213 ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString());
3214 ol.addLabel(cfname,fmd->anchor());
3215 ol.docify(fmd->name());
3217 ol.writeString(" ");
3218 ol.enableAll();
3219 ol.endDoxyAnchor(cfname,fmd->anchor());
3220 ol.endDescTableTitle();
3221 if (hasInits)
3222 {
3223 ol.startDescTableInit();
3224 if (!fmd->initializer().empty())
3225 {
3226 DString initStr = fmd->initializer().stripWhiteSpace();
3227 if (initStr.startsWith("=")) initStr = initStr.mid(1).stripWhiteSpace();
3229 ol.writeString("(");
3230 ol.enableAll();
3231 ol.docify(initStr);
3233 ol.writeString(")");
3234 ol.enableAll();
3235 }
3236 ol.endDescTableInit();
3237 }
3238 ol.startDescTableData();
3239
3240 bool hasBrief = !fmd->briefDescription().empty();
3241 bool hasDetails = !fmd->documentation().empty();
3242
3243 if (hasBrief)
3244 {
3245 ol.generateDoc(fmd->briefFile(),
3246 fmd->briefLine(),
3247 getOuterScope()?getOuterScope():container,
3248 fmd,
3249 fmd->briefDescription(),
3250 DocOptions()
3251 .setIndexWords(true));
3252 }
3253 if (hasDetails)
3254 {
3255 ol.generateDoc(fmd->docFile(),
3256 fmd->docLine(),
3257 getOuterScope()?getOuterScope():container,
3258 fmd,
3259 fmd->documentation()+"\n",
3260 DocOptions()
3261 .setIndexWords(true));
3262 }
3263 ol.endDescTableData();
3264 ol.endDescTableRow();
3265 }
3266 }
3267 if (!first)
3268 {
3269 ol.endDescTable();
3270 }
3271 }
3272}
3273
3274// match from the start of the scope until the last marker
3275static const reg::Ex reAnonymous(R"([\w:@]*@\d+)");
3276
3278{
3279 DString ldef = definition();
3280 DString title = name();
3281 if (isEnumerate())
3282 {
3283 if (isAnonymous())
3284 {
3285 ldef = title = "anonymous enum";
3286 if (!m_enumBaseType.empty())
3287 {
3288 ldef+=" : "+m_enumBaseType;
3289 }
3290 }
3291 else
3292 {
3293 ldef.prepend("enum ");
3294 if (isSliceLocal())
3295 {
3296 ldef.prepend("local ");
3297 }
3298 }
3299 }
3300 else if (isEnumValue())
3301 {
3302 if (isAnonymous())
3303 {
3304 ldef=ldef.mid(2);
3305 }
3306 }
3307
3308 std::string sdef = ldef.str();
3309 reg::Match match;
3310 if (reg::search(sdef,match,reAnonymous))
3311 {
3312 const ClassDef *annoClassDef=getClassDefOfAnonymousType();
3313 if (annoClassDef)
3314 {
3315 static const reg::Ex ar(R"([\w@:]*@\d+[\w@:]*)");
3316 reg::Match amatch;
3317 reg::search(sdef,amatch,ar);
3318 ldef = amatch.prefix().str() + annoClassDef->displayName() + amatch.suffix().str();
3319 }
3320 else
3321 {
3322 ldef = match.prefix().str() + " { ... } " + removeAnonymousScopes(match.suffix().str());
3323 }
3324 }
3325
3326 const ClassDef *cd=getClassDef();
3327 if (cd && cd->isObjectiveC())
3328 {
3329 // strip scope name
3330 if (size_t ep = ldef.find("::"); ep!=DString::npos)
3331 {
3332 if (size_t sp=ldef.rfind(' ',ep); sp!=DString::npos)
3333 {
3334 ldef=ldef.left(sp+1)+ldef.mid(ep+2);
3335 }
3336 }
3337 // strip keywords
3338 if (size_t dp = ldef.find(':'); dp!=DString::npos)
3339 {
3340 ldef=ldef.left(dp+1);
3341 }
3342 int l=static_cast<int>(ldef.length());
3343 //printf("start >%s<\n",qPrint(ldef));
3344 int i=l-1;
3345 while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
3346 while (i>=0 && isspace(static_cast<uint8_t>(ldef.at(i)))) i--;
3347 if (i>0)
3348 {
3349 // insert branches around the type
3350 ldef = "("+ldef.left(i+1)+")"+ldef.mid(i+1);
3351 }
3352 //printf("end >%s< i=%d\n",qPrint(ldef),i);
3353 if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
3354 }
3355 SrcLangExt lang = getLanguage();
3356 DString sep = getLanguageSpecificSeparator(lang,true);
3357 return substitute(ldef,"::",sep);
3358}
3359
3361{
3362 SrcLangExt lang = getLanguage();
3363 bool written = false;
3364 if (m_incInfo) // explicit \headerfile command
3365 {
3366 DString nm=m_incInfo->includeName.empty() ?
3367 (m_incInfo->fileDef ?
3368 m_incInfo->fileDef->docName() : DString()
3369 ) : m_incInfo->includeName;
3370 if (!nm.empty())
3371 {
3372 ol.startParagraph();
3373 ol.startTypewriter();
3374 ol.docify(::includeStatement(lang,m_incInfo->kind));
3375 ol.docify(::includeOpen(lang,m_incInfo->kind));
3376 ol.pushGeneratorState();
3378 ol.docify(nm);
3381 if (m_incInfo->fileDef)
3382 {
3383 ol.writeObjectLink(DString(),m_incInfo->fileDef->includeName(),DString(),nm);
3384 }
3385 else
3386 {
3387 ol.docify(nm);
3388 }
3389 ol.popGeneratorState();
3390 ol.docify(::includeClose(lang,m_incInfo->kind));
3391 ol.endTypewriter();
3392 ol.endParagraph();
3393 written = true;
3394 }
3395 }
3396 if (!written) // only write out the include file if this is not part of a class or file definition
3397 {
3398 bool showGroupedMembInc = Config_getBool(SHOW_GROUPED_MEMB_INC);
3399 bool forceLocalIncludes = Config_getBool(FORCE_LOCAL_INCLUDES);
3400 const FileDef *fd = getFileDef();
3401 DString nm;
3402 if (inGroup && fd && showGroupedMembInc)
3403 {
3404 if (!Config_getList(STRIP_FROM_INC_PATH).empty())
3405 {
3407 }
3408 else
3409 {
3410 nm = fd->name();
3411 }
3412 }
3413 if (!nm.empty())
3414 {
3415 ol.startParagraph();
3416 ol.startTypewriter();
3417 bool isIDLorJava = lang==SrcLangExt::IDL || lang==SrcLangExt::Java;
3418 if (isIDLorJava)
3419 {
3420 ol.docify("import ");
3421 }
3422 else
3423 {
3424 ol.docify("#include ");
3425 }
3426
3427 if (isIDLorJava || forceLocalIncludes) ol.docify("\""); else ol.docify("<");
3428
3429 if (fd && fd->isLinkable())
3430 {
3431 ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),fd->anchor(),nm);
3432 }
3433 else
3434 {
3435 ol.docify(nm);
3436 }
3437
3438 if (isIDLorJava || forceLocalIncludes) ol.docify("\""); else ol.docify(">");
3439
3440 ol.endTypewriter();
3441 ol.endParagraph();
3442 }
3443 }
3444}
3445
3447{
3448 //printf("md=%s initLines=%d init='%s'\n",qPrint(name()),initLines,qPrint(init));
3449 ol.startBold();
3450 if (m_mtype==MemberType::Define)
3452 else
3454 ol.endBold();
3455 DString langCorrected = getDefFileExtension();
3457 if (srcLangExt == SrcLangExt::Lex)
3458 {
3459 langCorrected = ".doxygen_lex_c";
3460 srcLangExt = SrcLangExt::Cpp;
3461 }
3462 auto intf = Doxygen::parserManager->getCodeParser(langCorrected);
3463 intf->resetCodeParserState();
3464 auto &codeOL = ol.codeGenerators();
3465 codeOL.startCodeFragment("DoxyCode");
3466 intf->parseCode(codeOL,scopeName,m_initializer,srcLangExt,Config_getBool(STRIP_CODE_COMMENTS),
3469 .setInlineFragment(true)
3470 .setMemberDef(this)
3471 .setShowLineNumbers(false)
3472 .setSearchCtx(this)
3473 );
3474 codeOL.endCodeFragment("DoxyCode");
3475}
3476
3477/*! Writes the "detailed documentation" section of this member to
3478 * all active output formats.
3479 */
3481 int memCount,int memTotal,
3482 OutputList &ol,
3483 const DString &scName,
3484 const Definition *container,
3485 bool inGroup,
3486 bool /* showEnumValues */,
3487 bool showInline
3488 ) const
3489{
3490 // if this member is in a group find the real scope name.
3491 bool hasParameterList = false;
3492
3493 //printf("MemberDefImpl::writeDocumentation(): name='%s' hasDocs='%d' containerType=%d inGroup=%d sectionLinkable=%d\n",
3494 // qPrint(name()),hasDocs,container->definitionType(),inGroup,hasDetailedDescription());
3495
3496 //if ( !hasDocs ) return;
3497 //if (isEnumValue() && !showEnumValues) return;
3498
3499 SrcLangExt lang = getLanguage();
3500 //printf("member=%s lang=%d\n",qPrint(name()),lang);
3501 bool optVhdl = lang==SrcLangExt::VHDL;
3502 DString sep = getLanguageSpecificSeparator(lang,true);
3503
3504 DString scopeName = scName;
3505 DString memAnchor = anchor();
3506 DString ciname = container->displayName();
3507 const Definition *scopedContainer = container; // see bug 753608
3508 if (container->definitionType()==TypeGroup)
3509 {
3510 if (getClassDef()) { scopeName=getClassDef()->displayName(); scopedContainer=getClassDef(); }
3511 else if (getNamespaceDef()) { scopeName=getNamespaceDef()->displayName(); scopedContainer=getNamespaceDef(); }
3512 else if (getFileDef()) { scopeName=getFileDef()->displayName(); scopedContainer=getFileDef(); }
3513 ciname = (toGroupDef(container))->groupTitle();
3514 }
3515 else if (container->definitionType()==TypeFile && getNamespaceDef() && getNamespaceDef()->isLinkable())
3516 { // member is in a namespace, but is written as part of the file documentation
3517 // as well, so we need to make sure its anchor is unique (it is not really used).
3518 memAnchor.prepend("file_");
3519 }
3520
3521 DString cname = container->name();
3522 DString cfname = getOutputFileBase();
3523
3524 // get member name
3525 DString doxyName=name();
3526 // prepend scope if there is any. TODO: make this optional for C only docs
3527 if (!scopeName.empty())
3528 {
3529 doxyName.prepend(scopeName+sep);
3530 }
3531 DString doxyArgs=argsString();
3532
3533 DString ldef = definition();
3534 DString title = name();
3535
3536 //printf("member '%s' def='%s'\n",qPrint(name()),qPrint(ldef));
3537 if (isEnumerate())
3538 {
3539 if (title.at(0)=='@')
3540 {
3541 ldef = title = "anonymous enum";
3542 if (isSliceLocal())
3543 {
3544 ldef.prepend("local ");
3545 }
3546 if (lang==SrcLangExt::Cpp)
3547 {
3548 if (isEnumStruct()) ldef.append(" struct");
3549 else if (isStrong()) ldef.append(" class");
3550 }
3551 if (!m_enumBaseType.empty())
3552 {
3553 ldef+=" : "+m_enumBaseType;
3554 }
3555 }
3556 else
3557 {
3558 if (lang==SrcLangExt::Cpp)
3559 {
3560 if (isEnumStruct()) ldef.prepend("struct ");
3561 else if (isStrong()) ldef.prepend("class ");
3562 }
3563 ldef.prepend("enum ");
3564 if (isSliceLocal())
3565 {
3566 ldef.prepend("local ");
3567 }
3568 }
3569 }
3570 else if (isEnumValue())
3571 {
3572 if (ldef.at(0)=='@')
3573 {
3574 ldef=ldef.mid(2);
3575 }
3576 }
3577 else if (isFunction() && !isObjCMethod())
3578 {
3579 title += "()";
3580 }
3581 if (lang == SrcLangExt::Slice)
3582 {
3583 // Remove the container scope from the member name.
3584 DString prefix = scName + sep;
3585 if (size_t pos = ldef.rfind(prefix); pos != DString::npos)
3586 {
3587 ldef.remove(pos, prefix.length());
3588 }
3589 }
3590 ldef.stripPrefix("constexpr ");
3591 ldef.stripPrefix("consteval ");
3592 ldef.stripPrefix("constinit ");
3593 ldef.stripPrefix("static ");
3594
3595 //----------------------------------------
3596
3597 ol.pushGeneratorState();
3598
3599 bool htmlEndLabelTable=false;
3600 StringVector sl = getLabels(scopedContainer);
3601 auto startHtmlLabelTable = [&]()
3602 {
3603 if (!sl.empty())
3604 {
3605 ol.pushGeneratorState();
3606 ol.disableAll();
3608 ol.writeString("<table class=\"mlabels\">\n");
3609 ol.writeString(" <tr>\n");
3610 ol.writeString(" <td class=\"mlabels-left\">\n");
3611 ol.popGeneratorState();
3612 htmlEndLabelTable=true;
3613 }
3614 };
3615
3616 static const reg::Ex r(R"(@\d+)");
3617 reg::Match match;
3618 std::string sdef = ldef.str();
3619 LinkifyTextOptions options;
3620 options.setScope(scopedContainer).setFileScope(getBodyDef()).setSelf(this);
3621 if ((isVariable() || isTypedef()) && reg::search(sdef,match,r))
3622 {
3623 // find enum type and insert it in the definition
3624 bool found=false;
3625 for (const auto &vmd : *ml)
3626 {
3627 if (vmd->isEnumerate() && match.str()==vmd->name())
3628 {
3629 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3630 ol.startMemberDoc(ciname,name(),memAnchor,name(),memCount,memTotal,showInline);
3631 ol.addLabel(cfname, memAnchor);
3632 DString prefix = match.prefix().str();
3633 DString suffix = match.suffix().str();
3635 vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef(),getModuleDef());
3636 linkifyText(TextGeneratorOLImpl(ol),suffix,options);
3637
3638 found=true;
3639 break;
3640 }
3641 }
3642 if (!found) // anonymous compound
3643 {
3644 const ClassDef *annoClassDef=getClassDefOfAnonymousType();
3645 DString typeName;
3646 if (annoClassDef) typeName=annoClassDef->compoundTypeString();
3647 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3648 ol.startMemberDoc(ciname,name(),memAnchor,title,memCount,memTotal,showInline);
3649 ol.addLabel(cfname, memAnchor);
3650 // search for the last anonymous compound name in the definition
3651
3652 startHtmlLabelTable();
3654 if (reg::search(sdef,match,reAnonymous))
3655 {
3656 static const reg::Ex ar(R"([\w@:]*@\d+[\w@:]*)");
3657 reg::Match amatch;
3658 reg::search(sdef,amatch,ar);
3659 DString prefix = amatch.prefix().str();
3660 DString suffix = removeAnonymousScopes(amatch.suffix().str());
3661 //printf("writeDocumentation(): anonymous compound in definition: sdef='%s' prefix='%s' suffix='%s' annoClassDef=%p\n",
3662 // qPrint(sdef), qPrint(prefix),qPrint(suffix),(void*)annoClassDef);
3663 const MemberDef *amd = getAnonymousEnumType();
3664 if (annoClassDef && amd==nullptr)
3665 {
3666 ol.docify(prefix);
3667 DString annTypeName = annoClassDef->displayName(true);
3668 if (suffix.empty())
3669 {
3670 suffix="::"+localName();
3671 }
3672 ol.writeObjectLink(annoClassDef->getReference(),annoClassDef->getOutputFileBase(),
3673 annoClassDef->anchor(),annTypeName);
3674 linkifyText(TextGeneratorOLImpl(ol),suffix,options);
3675 }
3676 else if (amd) // type is an anonymous enum
3677 {
3678 DString typePlaceholder = " { ... } ";
3679 if (lang==SrcLangExt::Cpp)
3680 {
3681 if (amd->isEnumStruct()) typePlaceholder.prepend(" struct");
3682 else if (amd->isStrong()) typePlaceholder.prepend(" class");
3683 }
3684 ol.writeObjectLink(amd->getReference(),amd->getOutputFileBase(),amd->anchor(),prefix+typePlaceholder+suffix);
3685 }
3686 else
3687 {
3688 prefix = match.prefix().str();
3689 suffix = removeAnonymousScopes(match.suffix().str());
3690 ol.docify(prefix);
3691 ol.docify(" ");
3693 //ol.docify(" { ... } ");
3694 linkifyText(TextGeneratorOLImpl(ol),suffix,options);
3695 }
3696 }
3697 else
3698 {
3699 linkifyText(TextGeneratorOLImpl(ol),ldef,options);
3700 }
3701 }
3702 }
3703 else // not an enum value or anonymous compound
3704 {
3705 ol.startDoxyAnchor(cfname, cname, memAnchor, doxyName, doxyArgs);
3706 ol.startMemberDoc(ciname,name(),memAnchor,title,memCount,memTotal,showInline);
3707 ol.addLabel(cfname, memAnchor);
3708
3709 if (!m_metaData.empty() && getLanguage()==SrcLangExt::Slice)
3710 {
3712 ol.docify(m_metaData);
3714 }
3715
3716 const ClassDef *cd=getClassDef();
3717 const NamespaceDef *nd=getNamespaceDef();
3718 if (!m_defTmpArgLists.empty() && lang==SrcLangExt::Cpp)
3719 // definition has explicit template parameter declarations
3720 {
3721 for (const ArgumentList &tal : m_defTmpArgLists)
3722 {
3723 if (!tal.empty())
3724 {
3726 _writeTemplatePrefix(ol,scopedContainer,tal);
3728 }
3729 }
3730 }
3731 else // definition gets it template parameters from its class
3732 // (since no definition was found)
3733 {
3734 if (cd && lang==SrcLangExt::Cpp && !isTemplateSpecialization())
3735 {
3736 for (const ArgumentList &tal : cd->getTemplateParameterLists())
3737 {
3738 if (!tal.empty())
3739 {
3741 _writeTemplatePrefix(ol,scopedContainer,tal,false);
3743 }
3744 }
3745 }
3746 if (m_tArgList.hasParameters() && lang==SrcLangExt::Cpp) // function template prefix
3747 {
3749 _writeTemplatePrefix(ol,scopedContainer,m_tArgList);
3751 }
3752 }
3753
3754 startHtmlLabelTable();
3755
3757 if (cd && cd->isObjectiveC())
3758 {
3759 // strip scope name
3760 if (size_t ep = ldef.find("::"); ep!=DString::npos)
3761 {
3762 if (size_t sp=ldef.rfind(' ',ep); sp!=DString::npos)
3763 {
3764 ldef=ldef.left(sp+1)+ldef.mid(ep+2);
3765 } else {
3766 ldef=ldef.mid(ep+2);
3767 }
3768 }
3769 // strip keywords
3770 if (size_t dp = ldef.find(':'); dp!=DString::npos)
3771 {
3772 ldef=ldef.left(dp+1);
3773 }
3774 int dl=static_cast<int>(ldef.length());
3775 //printf("start >%s<\n",qPrint(ldef));
3776 int i=dl-1;
3777 while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
3778 while (i>=0 && isspace(static_cast<uint8_t>(ldef.at(i)))) i--;
3779 if (i>0)
3780 {
3781 // insert branches around the type
3782 ldef="("+ldef.left(i+1)+")"+ldef.mid(i+1);
3783 }
3784 //printf("end >%s< i=%d\n",qPrint(ldef),i);
3785 if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
3786 }
3787
3788 if (optVhdl)
3789 {
3790 hasParameterList=VhdlDocGen::writeVHDLTypeDocumentation(this,scopedContainer,ol);
3791 }
3792 else if (lang==SrcLangExt::Slice)
3793 {
3794 // Eliminate the self-reference.
3795 size_t pos = ldef.rfind(' ');
3796 if (pos==DString::npos) pos=0;
3797 if (pos>0)
3798 {
3799 linkifyText(TextGeneratorOLImpl(ol),ldef.left(pos),options);
3800 }
3801 ol.docify(ldef.mid(pos));
3802 const Definition *scope = cd;
3803 if (scope==nullptr) scope = nd;
3804 hasParameterList=writeDefArgumentList(ol,scope,this);
3805 }
3806 else
3807 {
3808 linkifyText(TextGeneratorOLImpl(ol),substitute(ldef,"::",sep),options);
3809 const Definition *scope = cd;
3810 if (scope==nullptr) scope = nd;
3811 hasParameterList=writeDefArgumentList(ol,scope,this);
3812 }
3813
3814 if (hasOneLineInitializer()) // add initializer
3815 {
3816 if (isTypeAlias())
3817 {
3818 ol.docify(" = ");
3821 }
3822 else if (!isDefine())
3823 {
3824 ol.docify(" ");
3827 }
3828 else
3829 {
3832 }
3833 }
3834 if (!excpString().empty()) // add exception list
3835 {
3836 writeExceptionList(ol,cd,this);
3837 hasParameterList=true; // call endParameterList below
3838 }
3839 }
3840
3841 ol.pushGeneratorState();
3843 if (!sl.empty())
3844 {
3845 ol.startLabels();
3846 size_t count=0;
3847 for (const auto &s : sl)
3848 {
3849 count++;
3850 ol.writeLabel(s,count==sl.size());
3851 }
3852 ol.endLabels();
3853 }
3854 ol.popGeneratorState();
3855
3856 if (hasParameterList)
3857 {
3858 ol.endParameterList();
3859 ol.endMemberDoc(true);
3860 }
3861 else
3862 {
3863 ol.endMemberDocName();
3864 ol.endMemberDoc(false);
3865 }
3866
3867 // for HTML write the labels here
3868 ol.pushGeneratorState();
3869 ol.disableAll();
3871 if (htmlEndLabelTable)
3872 {
3873 ol.writeString(" </td>\n");
3874 ol.writeString(" <td class=\"mlabels-right\">\n");
3875 ol.startLabels();
3876 size_t count=0;
3877 for (const auto &s : sl)
3878 {
3879 count++;
3880 ol.writeLabel(s,count==sl.size());
3881 }
3882 ol.endLabels();
3883 ol.writeString(" </td>\n");
3884 ol.writeString(" </tr>\n");
3885 ol.writeString("</table>\n");
3886 }
3887 ol.writeString("</div>");
3888 ol.popGeneratorState();
3889
3890
3891 ol.endDoxyAnchor(cfname,memAnchor);
3892 ol.startIndent();
3893
3894 _writeGroupInclude(ol,inGroup);
3895
3896 /* write multi-line initializer (if any) */
3898
3899 /* write brief description */
3900 DString brief = briefDescription();
3901 if (!brief.empty() &&
3902 (Config_getBool(REPEAT_BRIEF) ||
3903 !Config_getBool(BRIEF_MEMBER_DESC)
3904 )
3905 )
3906 {
3907 ol.startParagraph();
3909 briefLine(),
3910 scopedContainer,
3911 this,
3912 brief,
3913 DocOptions()
3914 .setSingleLine(true));
3915 ol.endParagraph();
3916 }
3917
3918 /* write detailed description */
3919 DString detailed = documentation();
3920 if (!detailed.empty() ||
3921 !inbodyDocumentation().empty())
3922 {
3923 // write vhdl inline code with or without option INLINE_SOURCE
3924 if (optVhdl && VhdlDocGen::isMisc(this))
3925 {
3926 VhdlDocGen::writeSource(this,ol,cname);
3927 return;
3928 }
3929 else
3930 {
3931 ol.generateDoc(docFile(),
3932 docLine(),
3933 scopedContainer,
3934 this,
3935 detailed+"\n",
3936 DocOptions()
3937 .setIndexWords(true));
3938 }
3939
3940 if (!inbodyDocumentation().empty())
3941 {
3943 inbodyLine(),
3944 scopedContainer,
3945 this,
3946 inbodyDocumentation()+"\n",
3947 DocOptions()
3948 .setIndexWords(true));
3949 }
3950 }
3951 else if (!brief.empty() && (Config_getBool(REPEAT_BRIEF) || !Config_getBool(BRIEF_MEMBER_DESC)))
3952 {
3953 if (!inbodyDocumentation().empty())
3954 {
3956 inbodyLine(),
3957 scopedContainer,
3958 this,
3959 inbodyDocumentation()+"\n",
3960 DocOptions()
3961 .setIndexWords(true));
3962 }
3963 }
3964
3965
3966 //printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n",
3967 // defArgList,
3968 // defArgList?defArgList->hasDocumentation():-1);
3969 const ArgumentList &docArgList = m_templateMaster ?
3972 ol.generateDoc(docFile(),
3973 docLine(),
3974 scopedContainer,
3975 this, // memberDef
3976 inlineArgListToDoc(docArgList), // docStr
3977 DocOptions()
3978 .setIndexWords(true));
3979
3980 const ArgumentList &docTemplateArgList = m_templateMaster ?
3982 m_tArgList;
3983 ol.generateDoc(docFile(),
3984 docLine(),
3985 scopedContainer,
3986 this, // memberDef
3987 inlineTemplateArgListToDoc(docTemplateArgList), // docStr
3988 DocOptions()
3989 .setIndexWords(true));
3990
3991 _writeEnumValues(ol,scopedContainer,cfname,ciname,cname);
3995 _writeExamples(ol);
3997 DString scopeStr = getScopeString();
3998 writeSourceDef(ol);
3999 writeInlineCode(ol,scopeStr);
4000 if (hasReferencesRelation()) writeSourceRefs(ol,scopeStr);
4001 if (hasReferencedByRelation()) writeSourceReffedBy(ol,scopeStr);
4002 _writeCallGraph(ol);
4005
4006 ol.endIndent();
4007
4008 // enable LaTeX again
4009 //if (Config_getBool(EXTRACT_ALL) && !hasDocs) ol.enable(OutputType::Latex);
4010 ol.popGeneratorState();
4011
4013}
4014
4015// strip scope and field name from the type
4016// example: "struct N<K::J>::S.v.c" will become "struct v"
4018{
4020 if (ts.endsWith("::")) ts = ts.left(ts.length()-2);
4021 static const reg::Ex re1(R"(\a\w*::)"); // non-template version
4022 static const reg::Ex re2(R"(\a\w*<[^>]*>::)"); // template version
4023 reg::Match match;
4024 std::string t = ts.str();
4025 while (reg::search(t,match,re2) || reg::search(t,match,re1))
4026 {
4027 t = match.prefix().str() + match.suffix().str(); // remove the matched part
4028 }
4029 //printf("simplifyTypeForTable(%s)->%s\n",qPrint(s),qPrint(t));
4030 return t;
4031}
4032
4034{
4035 DString type = m_type;
4036 if (isTypedef() && getLanguage() != SrcLangExt::Slice) type.prepend("typedef ");
4037 return simplifyTypeForTable(type);
4038}
4039
4041{
4042 Definition *scope = getOuterScope();
4043 DString doxyName = name();
4044 DString doxyArgs = argsString();
4045 DString memAnchor = anchor();
4046 DString cfname = getOutputFileBase();
4047 DString cname;
4048 if (scope) cname = scope->name();
4049 if (doxyName.at(0)=='@')
4050 {
4051 doxyName="__unnamed__";
4052 }
4053
4054 LinkifyTextOptions options;
4055 options.setScope(scope).setFileScope(getBodyDef()).setSelf(this);
4056
4057 if (container && container->definitionType()==Definition::TypeClass &&
4058 !(toClassDef(container))->isJavaEnum())
4059 {
4061 ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
4062 ol.addLabel(cfname,memAnchor);
4063
4064 bool written=false;
4065 const ClassDef *annoClassDef=getClassDefOfAnonymousType();
4066 if (annoClassDef)
4067 {
4068 static const reg::Ex ar(R"([\w@:]*@\d+[\w@:]*)"); // anonymous type marker(s) including scope
4069 reg::Match amatch;
4070 std::string stype = m_type.str();
4071 if (reg::search(stype,amatch,ar))
4072 {
4073 size_t ai = amatch.position();
4074 size_t al = amatch.length();
4075 ol.writeObjectLink(annoClassDef->getReference(),annoClassDef->getOutputFileBase(),
4076 annoClassDef->anchor(),m_type.left(ai)+m_type.mid(ai+al));
4077 written=true;
4078 }
4079 }
4080 if (!written)
4081 {
4082 DString ts;
4083 if (isFunctionPtr())
4084 {
4085 ts = m_type + m_args;
4086 }
4087 else
4088 {
4089 ts = fieldType();
4090 }
4091 linkifyText(TextGeneratorOLImpl(ol),ts,options);
4092 }
4093 ol.endDoxyAnchor(cfname,memAnchor);
4095 }
4096
4098 ol.docify(doxyName);
4099 if (isVariable() && !argsString().empty() && !isObjCMethod() && !isFunctionPtr())
4100 {
4102 }
4103 if (!m_bitfields.empty()) // add bitfields
4104 {
4106 }
4107 if (hasOneLineInitializer() && !isDefine())
4108 {
4109 ol.writeString(" ");
4111 }
4113
4115
4116 DString brief = briefDescription();
4117 DString detailed = documentation();
4118
4119 /* write brief description */
4120 if (!brief.empty())
4121 {
4123 briefLine(),
4124 getOuterScope()?getOuterScope():container,this,
4125 brief,
4126 DocOptions()
4127 .setSingleLine(true));
4128 }
4129
4130 /* write detailed description */
4131 if (!detailed.empty())
4132 {
4133 if (!brief.empty())
4134 {
4136 ol.lineBreak();
4138 }
4139 ol.generateDoc(docFile(),
4140 docLine(),
4141 getOuterScope()?getOuterScope():container,this,
4142 detailed+"\n",
4143 DocOptions());
4144 }
4145
4146 ol.endInlineMemberDoc();
4147}
4148
4150{
4151 if (m_mtype == MemberType::Define)
4152 {
4153 return "macro definition";
4154 }
4155 else if (m_mtype == MemberType::Enumeration)
4156 {
4157 return "enumeration";
4158 }
4159 return to_string_lower(m_mtype);
4160}
4161
4163{
4164 /*
4165 * Removed bug_303020:
4166 * if (m_memberGroup) return;
4167 */
4168 const ClassDef *cd = getClassDef();
4169 const NamespaceDef *nd = getNamespaceDef();
4170 const FileDef *fd = getFileDef();
4171 const GroupDef *gd = getGroupDef();
4172 const Definition *d=nullptr;
4173 DString t;
4174 if (cd)
4175 {
4176 t=cd->compoundTypeString();
4177 d=cd;
4178 }
4179 else if (nd)
4180 {
4181 t=nd->compoundTypeString();
4182 d=nd;
4183 }
4184 else if (gd)
4185 {
4186 t="group";
4187 d=gd;
4188 }
4189 else
4190 {
4191 t="file";
4192 d=fd;
4193 }
4194 bool extractAll = Config_getBool(EXTRACT_ALL);
4195
4196 //printf("%s:warnIfUndoc: hasUserDocs=%d isFriendClass=%d protection=%d isRef=%d isDel=%d\n",
4197 // qPrint(name()),
4198 // hasUserDocumentation(),isFriendClass(),protectionLevelVisible(m_prot),isReference(),isDeleted());
4199 if ((!hasUserDocumentation() && !extractAll) &&
4200 !isFriendClass() &&
4201 name().find('@')==DString::npos && d && d->name().find('@')==DString::npos &&
4204 !isReference() && !isDeleted()
4205 )
4206 {
4207 SrcLangExt lang = getLanguage();
4208 DString sep = getLanguageSpecificSeparator(lang,true);
4209 warn_undoc(getDefFileName(),getDefLine(),"Member {}{} ({}) of {} {} is not documented.",
4211 substitute(d->name(),"::",sep));
4212 }
4213 else if (!hasDetailedDescription())
4214 {
4216 }
4217
4218 // if it is an enum, we check that its members are documented
4219 if (!extractAll && isEnumerate() && Config_getBool(WARN_IF_UNDOC_ENUM_VAL))
4220 {
4221 for (const auto &fmd : enumFieldList())
4222 {
4223 if (!fmd->isLinkableInProject())
4224 {
4225 SrcLangExt lang = getLanguage();
4226 DString sep = getLanguageSpecificSeparator(lang,true);
4227 warn(fmd->getDefFileName(),fmd->getDefLine(), "Documentation for enum member '{}{}{}' is missing.",
4228 qualifiedName(),sep,fmd->name());
4229 }
4230 }
4231 }
4232}
4233
4235{
4236 bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
4237 bool extractStatic = Config_getBool(EXTRACT_STATIC);
4238 return (!isAnonymous() &&
4239 (!hideUndocMembers || hasDocumentation()) &&
4240 (!isStatic() || extractStatic) &&
4241 isLinkable()
4242 );
4243}
4244
4245static DString stripTrailingReturn(const DString &trailRet)
4246{
4247 DString ret = trailRet;
4248
4249 ret = ret.stripWhiteSpace();
4250 if (ret.startsWith("->"))
4251 {
4252 ret = ret.mid(2).stripWhiteSpace();
4253 return ret;
4254 }
4255 return trailRet;
4256}
4257
4259
4260void MemberDefImpl::detectUndocumentedParams(bool hasParamCommand,bool hasReturnCommand) const
4261{
4262 //printf("%s:detectUndocumentedParams(%d,%d)\n",qPrint(name()),hasParamCommand,hasReturnCommand);
4263 bool isPython = getLanguage()==SrcLangExt::Python;
4264
4265 // this function is called while parsing the documentation. A member can have multiple
4266 // documentation blocks, which could be handled by multiple threads, hence this guard.
4267 std::lock_guard<std::mutex> lock(g_detectUndocumentedParamsMutex);
4268
4270 {
4271 //printf("%s:hasDocumentedParams=true;\n",qPrint(name()));
4272 m_hasDocumentedParams = true;
4273 }
4274 else if (!m_hasDocumentedParams)
4275 {
4276 const ArgumentList &al = argumentList();
4277 const ArgumentList &declAl = declArgumentList();
4278 bool allDoc=true; // no parameter => all parameters are documented
4279 if ( // member has parameters
4280 al.hasParameters() // with at least one parameter (that is not void)
4281 )
4282 {
4283 // see if all parameters have documentation
4284 for (auto it = al.begin(); it!=al.end() && allDoc; ++it)
4285 {
4286 const Argument &a = *it;
4287 if (!a.name.empty() && a.type!="void" && a.name!="..." &&
4288 !(isPython && (a.name=="self" || a.name=="cls"))
4289 )
4290 {
4291 allDoc = !a.docs.empty();
4292 }
4293 //printf("a.type=%s a.name=%s doc=%s\n",
4294 // qPrint(a.type),qPrint(a.name),qPrint(a.docs));
4295 }
4296 if (!allDoc && declAl.empty()) // try declaration arguments as well
4297 {
4298 allDoc=true;
4299 for (auto it = al.begin(); it!=al.end() && allDoc; ++it)
4300 {
4301 const Argument &a = *it;
4302 if (!a.name.empty() && a.type!="void" && a.name!="..." &&
4303 !(isPython && (a.name=="self" || a.name=="cls"))
4304 )
4305 {
4306 allDoc = !a.docs.empty();
4307 }
4308 //printf("a.name=%s doc=%s\n",qPrint(a.name),qPrint(a.docs));
4309 }
4310 }
4311 }
4312 if (allDoc)
4313 {
4314 //printf("%s:hasDocumentedParams=true;\n",qPrint(name()));
4315 m_hasDocumentedParams = true;
4316 }
4317 }
4318
4319 //printf("Member %s hasDocumentedReturnType=%d hasReturnCommand=%d\n",
4320 // qPrint(name()),m_hasDocumentedReturnType,hasReturnCommand);
4322}
4323
4325{
4326 DString returnType = typeString();
4327 bool isFortran = getLanguage()==SrcLangExt::Fortran;
4328 bool isFortranSubroutine = isFortran && returnType.find("subroutine")!=DString::npos;
4329
4330 bool isVoidReturn = returnType=="void" || returnType.endsWith(" void");
4331 if (!isVoidReturn && (returnType=="auto" || returnType.endsWith(" auto")))
4332 {
4334 if (!defArgList.trailingReturnType().empty())
4335 {
4336 DString strippedTrailingReturn = stripTrailingReturn(defArgList.trailingReturnType());
4337 isVoidReturn = (strippedTrailingReturn=="void") || (strippedTrailingReturn.endsWith(" void"));
4338 }
4339 }
4340 if (!Config_getBool(EXTRACT_ALL) &&
4341 Config_getBool(WARN_IF_UNDOCUMENTED) &&
4342 Config_getBool(WARN_NO_PARAMDOC) &&
4343 isFunction() &&
4344 !isDeleted() &&
4345 !isReference() &&
4347 {
4349 {
4351 "parameters of member {} are not documented",
4352 qualifiedName());
4353 }
4355 hasDocumentation() && !returnType.empty() &&
4356 !( // not one of the cases where nothing is returned
4357 isVoidReturn || // void return type
4358 isFortranSubroutine || // fortran subroutine
4359 isConstructor() || // a constructor
4360 isDestructor() || // or a destructor
4361 isFriend() // or a friend
4362 )
4363 )
4364 {
4366 "return type of member {} is not documented",
4367 qualifiedName());
4368 }
4369 }
4370 if (Config_getBool(WARN_IF_DOC_ERROR) &&
4372 (isVoidReturn || // void return type
4373 isFortranSubroutine || // fortran subroutine
4374 isConstructor() || // a constructor
4375 isDestructor())) // or destructor
4376 {
4377 warn_doc_error(docFile(),docLine(),"found documented return type for {} that does not return anything",
4378 qualifiedName());
4379 }
4380}
4381
4383{
4384 ClassDef *fcd=nullptr;
4385 DString baseName=name();
4386 if (size_t i=baseName.find('<'); i!=DString::npos) baseName=baseName.left(i);
4387 return (isFriendClass() &&
4388 (fcd=getClass(baseName)) && fcd->isLinkable());
4389}
4390
4392{
4393 return m_defArgList.isDeleted();
4394}
4395
4397{
4399 (m_mtype==MemberType::Enumeration && m_docEnumValues) || // has enum values
4400 (m_defArgList.hasDocumentation()|| m_tArgList.hasTemplateDocumentation()); // has doc (template) arguments
4401}
4402
4403
4408
4410{
4411 DString result;
4412 if (isStrong()) result=name();
4413 else if (getClassDef()) result=getClassDef()->displayName();
4414 else if (getNamespaceDef()) result=getNamespaceDef()->displayName();
4415 return result;
4416}
4417
4419{
4420 DString memAnchor = name();
4421 if (!m_args.empty()) memAnchor+=m_args;
4422 if (m_memSpec.isAlias()) // this is for backward compatibility
4423 {
4424 memAnchor.prepend(" = "+m_initializer);
4425 }
4426 memAnchor.prepend(definition()); // actually the method name is now included
4427 // twice, which is silly, but we keep it this way for backward
4428 // compatibility.
4429
4430 // include number of template arguments as well,
4431 // to distinguish between two template
4432 // specializations that only differ in the template parameters.
4434 {
4435 char buf[20];
4436 snprintf(buf,20,"%d:",static_cast<int>(m_tArgList.size()));
4437 buf[19]='\0';
4438 memAnchor.prepend(buf);
4439 }
4440 if (!m_requiresClause.empty())
4441 {
4442 memAnchor+=" "+m_requiresClause;
4443 }
4444 if (m_redefineCount>0)
4445 {
4446 char buf[20];
4447 snprintf(buf,20,":%d",m_redefineCount);
4448 buf[19]='\0';
4449 memAnchor.append(buf);
4450 }
4451
4452 // convert to md5 hash
4453 m_anc = "a"+md5str(memAnchor.view());
4454}
4455
4457 const DString &fileName,int startLine,
4458 bool hasDocs,MemberDef *member)
4459{
4460 //printf("%s MemberDefImpl::setGroupDef(%s)\n",qPrint(name()),qPrint(gd->name()));
4461 m_group=gd;
4462 m_grouppri=pri;
4463 m_groupFileName=fileName;
4464 m_groupStartLine=startLine;
4465 m_groupHasDocs=hasDocs;
4466 m_groupMember=member;
4468}
4469
4484
4492
4494{
4495 m_nspace=nd;
4496 setOuterScope(nd);
4497}
4498
4500 const ArgumentList &formalArgs,const std::unique_ptr<ArgumentList> &actualArgs) const
4501{
4502 //printf(" Member %s %s %s\n",qPrint(typeString()),qPrint(name()),qPrint(argsString()));
4503 std::unique_ptr<ArgumentList> actualArgList = std::make_unique<ArgumentList>(m_defArgList);
4504 if (!m_defArgList.empty())
4505 {
4506 // replace formal arguments with actuals
4507 for (Argument &arg : *actualArgList)
4508 {
4509 arg.type = substituteTemplateArgumentsInString(arg.type,formalArgs,actualArgs.get());
4510 }
4511 actualArgList->setTrailingReturnType(
4512 substituteTemplateArgumentsInString(actualArgList->trailingReturnType(),formalArgs,actualArgs.get()));
4513 }
4514
4515 DString methodName=name();
4516 if (methodName.startsWith("operator ")) // conversion operator
4517 {
4518 methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs.get());
4519 }
4520
4521 auto imd = createMemberDef(
4523 substituteTemplateArgumentsInString(m_type,formalArgs,actualArgs.get()),
4524 methodName,
4525 substituteTemplateArgumentsInString(m_args,formalArgs,actualArgs.get()),
4528 ArgumentList(), ArgumentList(), ""
4529 );
4530 auto mmd = toMemberDefMutable(imd.get());
4531 mmd->moveArgumentList(std::move(actualArgList));
4532 mmd->setDefinition(substituteTemplateArgumentsInString(m_def,formalArgs,actualArgs.get()));
4533 mmd->setBodyDef(getBodyDef());
4534 mmd->setBodySegment(getDefLine(),getStartBodyLine(),getEndBodyLine());
4535 mmd->setFormalTemplateArguments(formalArgs);
4536
4537 // TODO: init other member variables (if needed).
4538 // TODO: reimplemented info
4539 return imd;
4540}
4541
4543{
4544 //printf("%s: init=%s, initLines=%d maxInitLines=%d userInitLines=%d\n",
4545 // qPrint(name()),qPrint(m_initializer),m_initLines,
4546 // m_maxInitLines,m_userInitLines);
4547 bool isFuncLikeMacro = m_mtype==MemberType::Define && m_defArgList.hasParameters();
4548 return !m_initializer.empty() && m_initLines==0 && // one line initializer
4549 !isFuncLikeMacro &&
4550 ((m_maxInitLines>0 && m_userInitLines==-1) || m_userInitLines>0); // enabled by default or explicitly
4551}
4552
4554{
4555 //printf("initLines=%d userInitLines=%d maxInitLines=%d\n",
4556 // initLines,userInitLines,maxInitLines);
4557 bool isFuncLikeMacro = m_mtype==MemberType::Define && m_defArgList.hasParameters();
4558 return (m_initLines>0 || (!m_initializer.empty() && isFuncLikeMacro)) &&
4559 ((m_initLines<m_maxInitLines && m_userInitLines==-1) // implicitly enabled
4560 || m_initLines<m_userInitLines // explicitly enabled
4561 );
4562}
4563
4565{
4566 size_t indent=0;
4568 int l=static_cast<int>(m_initializer.length());
4569 int p=l-1;
4570 while (p>=0 && isspace(static_cast<uint8_t>(m_initializer.at(p)))) p--;
4574
4575 //printf("%s::setInitializer(%s)\n",qPrint(name()),qPrint(m_initializer));
4576}
4577
4579{
4580 bool optimizeOutputForC = Config_getBool(OPTIMIZE_OUTPUT_FOR_C);
4581 SrcLangExt lang = getLanguage();
4582 if (!isLinkableInProject()) return;
4583 DString memLabel;
4584 if (optimizeOutputForC)
4585 {
4586 memLabel=theTranslator->trGlobal(true,true);
4587 }
4588 else if (lang==SrcLangExt::Fortran)
4589 {
4590 memLabel=theTranslator->trSubprogram(true,true);
4591 }
4592 else
4593 {
4594 memLabel=theTranslator->trMember(true,true);
4595 }
4596 DString memName = name();
4599 (toClassDef(pd))->displayName() : pd->name();
4600 DString sep = getLanguageSpecificSeparator(lang,true);
4601 DString memArgs;
4602 if (!isRelated())
4603 {
4604 if (isObjCMethod())
4605 {
4606 memName = "[" + pd->name() + " " + name() + "]";
4607 }
4608 else
4609 {
4610 if (pd!=Doxygen::globalScope) memName.prepend(pdName+sep);
4611 memArgs = argsString();
4612 }
4613 }
4614 const RefItemVector &xrefItems = xrefListItems();
4615 if (sep!="::")
4616 {
4617 memName = substitute(memName,"::",sep);
4618 }
4619 addRefItem(xrefItems,
4620 qualifiedName()+argsString(), // argsString is needed for overloaded functions (see bug 609624)
4621 memLabel,
4622 getOutputFileBase()+"#"+anchor(),memName,memArgs,pd);
4623}
4624
4629
4631{
4632 auto it = m_sectionMap.find(container);
4633 return it!=m_sectionMap.end() ? it->second : nullptr;
4634}
4635
4637{
4638 //printf("MemberDefImpl::setSectionList(%s,%p) name=%s\n",qPrint(d->name()),sl,qPrint(name()));
4639 m_sectionMap.emplace(container,sl);
4640}
4641
4643{
4644 if (count>25)
4645 {
4647 "Internal inconsistency: recursion detected in overload relation for member {}!",name());
4648 return Specifier::Normal;
4649 }
4650 Specifier v = m_virt;
4651 const MemberDef *rmd = reimplements();
4652 while (rmd && v==Specifier::Normal)
4653 {
4654 v = rmd->virtualness(count+1)==Specifier::Normal ? Specifier::Normal : Specifier::Virtual;
4655 rmd = rmd->reimplements();
4656 }
4657 return v;
4658}
4659
4660void MemberDefImpl::writeTagFile(TextStream &tagFile,bool useQualifiedName,bool showNamespaceMembers) const
4661{
4662 if (!isLinkableInProject()) return;
4663 if (!showNamespaceMembers && getNamespaceDef()) return;
4664 tagFile << " <member kind=\"";
4665 if (m_mtype == MemberType::Enumeration)
4666 {
4667 tagFile << "enumeration";
4668 }
4669 else
4670 {
4671 tagFile << to_string_lower(m_mtype);
4672 }
4673 if (m_prot!=Protection::Public)
4674 {
4675 tagFile << "\" protection=\"";
4676 if (m_prot==Protection::Protected) tagFile << "protected";
4677 else if (m_prot==Protection::Package) tagFile << "package";
4678 else /* Private */ tagFile << "private";
4679 }
4680 if (m_virt!=Specifier::Normal)
4681 {
4682 tagFile << "\" virtualness=\"";
4683 if (m_virt==Specifier::Virtual) tagFile << "virtual";
4684 else /* Pure */ tagFile << "pure";
4685 }
4686 if (isStatic())
4687 {
4688 tagFile << "\" static=\"yes";
4689 }
4690 tagFile << "\">\n";
4691 if (typeString()!=DString("@"))
4692 {
4693 tagFile << " <type>" << convertToXML(typeString()) << "</type>\n";
4694 }
4697 tagFile << " <name>" << convertToXML(useQualifiedName ? qualifiedName() : name()) << "</name>\n";
4698 tagFile << " <anchorfile>" << convertToXML(fn) << "</anchorfile>\n";
4699 tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>\n";
4700 DString idStr = id();
4701 if (!idStr.empty())
4702 {
4703 tagFile << " <clangid>" << convertToXML(idStr) << "</clangid>\n";
4704 }
4705 tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>\n";
4706 if (isStrong())
4707 {
4708 for (const auto &fmd : m_enumFields)
4709 {
4710 if (!fmd->isReference())
4711 {
4712 tagFile << " <enumvalue file=\"" << convertToXML(fn);
4713 tagFile << "\" anchor=\"" << convertToXML(fmd->anchor());
4714 idStr = fmd->id();
4715 if (!idStr.empty())
4716 {
4717 tagFile << "\" clangid=\"" << convertToXML(idStr);
4718 }
4719 tagFile << "\">" << convertToXML(fmd->name()) << "</enumvalue>\n";
4720 }
4721 }
4722 }
4723 writeDocAnchorsToTagFile(tagFile);
4724 tagFile << " </member>\n";
4725}
4726
4728{
4729 m_isConstructorCached=1; // false
4730 if (getClassDef())
4731 {
4732 if (m_isDMember) // for D
4733 {
4734 m_isConstructorCached = name()=="this" ? 2 : 1;
4735 return;
4736 }
4737 else if (getLanguage()==SrcLangExt::PHP) // for PHP
4738 {
4739 m_isConstructorCached = name()=="__construct" ? 2 : 1;
4740 return;
4741 }
4742 else if (name()=="__init__" &&
4743 getLanguage()==SrcLangExt::Python) // for Python
4744 {
4745 m_isConstructorCached = 2; // true
4746 return;
4747 }
4748 else // for other languages
4749 {
4750 DString locName = getClassDef()->localName();
4751 size_t i=locName.find('<');
4752 if (i==DString::npos) // not a template class
4753 {
4754 m_isConstructorCached = name()==locName ? 2 : 1;
4755 }
4756 else
4757 {
4758 m_isConstructorCached = name()==locName.left(i) ? 2 : 1;
4759 }
4760 return;
4761 }
4762 }
4763}
4764
4766{
4767 if (m_isConstructorCached==0)
4768 {
4769 MemberDefImpl *that = const_cast<MemberDefImpl*>(this);
4770 that->_computeIsConstructor();
4771 }
4773 return m_isConstructorCached==2;
4774
4775}
4776
4778{
4779 bool isDestructor = false;
4780 if (m_isDMember) // for D
4781 {
4782 isDestructor = name()=="~this";
4783 }
4784 else if (getLanguage()==SrcLangExt::PHP) // for PHP
4785 {
4786 isDestructor = name()=="__destruct";
4787 }
4788 else if (name()=="__del__" &&
4789 getLanguage()==SrcLangExt::Python) // for Python
4790 {
4791 isDestructor = true;
4792 }
4793 else if (getLanguage()==SrcLangExt::Fortran) // for Fortran
4794 {
4795 isDestructor = typeString()=="final";
4796 }
4797 else // other languages
4798 {
4799 isDestructor =
4800 (name().find('~')!=DString::npos || name().find('!')!=DString::npos) // The ! is for C++/CLI
4801 && name().find("operator")==DString::npos;
4802 }
4804}
4805
4807{
4808 if (m_isDestructorCached==0)
4809 {
4810 MemberDefImpl *that=const_cast<MemberDefImpl*>(this);
4811 that->_computeIsDestructor();
4812 }
4814 return m_isDestructorCached==2;
4815}
4816
4818 const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,const ModuleDef *mod) const
4819{
4820 int enumMemCount=0;
4821
4822 uint32_t numVisibleEnumValues=0;
4823 for (const auto &fmd : m_enumFields)
4824 {
4825 if (fmd->isBriefSectionVisible()) numVisibleEnumValues++;
4826 }
4827 if (numVisibleEnumValues==0 && !isBriefSectionVisible())
4828 {
4829 return;
4830 }
4831
4832 DString n = name();
4833 if (size_t i=n.rfind("::"); i!=DString::npos) n=n.mid(i+2); // strip scope (TODO: is this needed?)
4834 if (n[0]!='@') // not an anonymous enum
4835 {
4837 {
4838 //_writeTagData(compoundType);
4839 writeLink(typeDecl,cd,nd,fd,gd,mod);
4840 }
4841 else
4842 {
4843 typeDecl.startBold();
4844 typeDecl.docify(n);
4845 typeDecl.endBold();
4846 }
4847 typeDecl.writeChar(' ');
4848 }
4849 if (!m_enumBaseType.empty())
4850 {
4851 typeDecl.writeChar(':');
4852 typeDecl.writeChar(' ');
4853 typeDecl.docify(m_enumBaseType);
4854 typeDecl.writeChar(' ');
4855 }
4856
4857 uint32_t enumValuesPerLine = static_cast<uint32_t>(Config_getInt(ENUM_VALUES_PER_LINE));
4858 if (numVisibleEnumValues>0 && enumValuesPerLine>0)
4859 {
4860 typeDecl.docify("{ ");
4861
4862 auto it = m_enumFields.begin();
4863 if (it!=m_enumFields.end())
4864 {
4865 const MemberDef *fmd=*it;
4866 bool fmdVisible = fmd->isBriefSectionVisible();
4867 bool first=true;
4868 while (fmd)
4869 {
4870 if (fmdVisible)
4871 {
4872 if (!first)
4873 {
4874 typeDecl.writeString(", ");
4875 }
4876 /* in html we start a new line after a number of items */
4877 if (numVisibleEnumValues>enumValuesPerLine
4878 && (enumMemCount%enumValuesPerLine)==0
4879 )
4880 {
4881 typeDecl.pushGeneratorState();
4883 typeDecl.enable(OutputType::Latex);
4884 typeDecl.enable(OutputType::Docbook);
4885 typeDecl.lineBreak();
4886 typeDecl.disable(OutputType::Latex);
4887 typeDecl.disable(OutputType::Docbook);
4888 typeDecl.writeString("&#160;&#160;");
4889 typeDecl.popGeneratorState();
4890 }
4891
4892 if (fmd->hasDocumentation()) // enum value has docs
4893 {
4894 fmd->writeLink(typeDecl,cd,nd,fd,gd,mod);
4895 }
4896 else // no docs for this enum value
4897 {
4898 typeDecl.startBold();
4899 typeDecl.docify(fmd->name());
4900 typeDecl.endBold();
4901 }
4902 if (fmd->hasOneLineInitializer()) // enum value has initializer
4903 {
4904 //typeDecl.writeString(" = ");
4905 typeDecl.writeString(" ");
4906 typeDecl.parseText(fmd->initializer());
4907 }
4908 first=false;
4909 }
4910
4911 bool prevVisible = fmdVisible;
4912 ++it;
4913 if (it!=m_enumFields.end())
4914 {
4915 fmd=*it;
4916 }
4917 else
4918 {
4919 fmd=nullptr;
4920 }
4921 if (prevVisible)
4922 {
4923 typeDecl.disable(OutputType::Man);
4924 typeDecl.writeString("\n"); // to prevent too long lines in LaTeX
4925 typeDecl.enable(OutputType::Man);
4926 enumMemCount++;
4927 }
4928 }
4929 if (numVisibleEnumValues>enumValuesPerLine)
4930 {
4931 typeDecl.pushGeneratorState();
4933 typeDecl.lineBreak();
4934 typeDecl.popGeneratorState();
4935 }
4936 }
4937 typeDecl.docify(" }");
4938 }
4939}
4940
4941void MemberDefImpl::moveArgumentList(std::unique_ptr<ArgumentList> al)
4942{
4943 m_defArgList = *al;
4944}
4945
4946void MemberDefImpl::moveDeclArgumentList(std::unique_ptr<ArgumentList> al)
4947{
4948 m_declArgList = *al;
4949}
4950
4955
4957{
4958 m_type = t;
4959}
4960
4967
4969{
4971 if (e) Doxygen::parseSourcesNeeded = true;
4972}
4973
4975{
4977 if (e) Doxygen::parseSourcesNeeded = true;
4978}
4979
4985
4991
4996
5001
5003{
5004 if (getClassDef() && getClassDef()->isObjectiveC() && isFunction()) return true;
5005 return false;
5006}
5007
5009{
5010 if (getClassDef() && getClassDef()->isObjectiveC() && isProperty()) return true;
5011 return false;
5012}
5013
5015{
5016 if (getClassDef() && getClassDef()->isCSharp() && isProperty()) return true;
5017 return false;
5018}
5019
5021{
5022 if (isObjCMethod())
5023 {
5024 DString qm;
5025 if (isStatic()) qm="+"; else qm="-";
5026 qm+="[";
5027 qm+=getClassDef()->name()+" ";
5028 qm+=name();
5029 qm+="]";
5030 return qm;
5031 }
5032 else if (m_enumScope && m_enumScope->isStrong())
5033 {
5034 return m_enumScope->qualifiedName()+
5036 localName();
5037 }
5038 else
5039 {
5041 }
5042}
5043
5045{
5046 if (ti)
5047 {
5048 //printf("%s: Setting tag name=%s anchor=%s\n",qPrint(name()),qPrint(ti->tagName),qPrint(ti->anchor));
5049 m_anc=ti->anchor;
5050 setReference(ti->tagName);
5052 }
5053}
5054
5055DString MemberDefImpl::objCMethodName(bool localLink,bool showStatic) const
5056{
5057 DString qm;
5058 if (showStatic)
5059 {
5060 if (isStatic()) qm="+ "; else qm="- ";
5061 }
5062 qm+=name();
5063 if (!localLink) // link to method of same class
5064 {
5065 qm+=" (";
5066 qm+=getClassDef()->name();
5067 qm+=")";
5068 }
5069 return qm;
5070}
5071
5073{
5074 return m_decl;
5075}
5076
5078{
5079 return m_def;
5080}
5081
5086
5088{
5089 return m_type;
5090}
5091
5093{
5094 return m_args;
5095}
5096
5098{
5099 return m_exception;
5100}
5101
5103{
5104 return m_bitfields;
5105}
5106
5108{
5109 return m_initializer;
5110}
5111
5113{
5114 return m_initLines;
5115}
5116
5118{
5119 return m_docTransferDone;
5120}
5121
5126
5131
5133{
5134 return m_classDef;
5135}
5136
5141
5146
5148{
5149 return m_fileDef;
5150}
5151
5153{
5154 return m_fileDef;
5155}
5156
5158{
5159 return m_nspace;
5160}
5161
5166
5168{
5169 return m_read;
5170}
5171
5173{
5174 return m_write;
5175}
5176
5178{
5179 return m_group;
5180}
5181
5183{
5184 return m_group;
5185}
5186
5188{
5189 return m_moduleDef;
5190}
5191
5196
5201
5203{
5204 return m_groupStartLine;
5205}
5206
5208{
5209 return m_groupHasDocs;
5210}
5211
5213{
5214 return m_prot;
5215}
5216
5218{
5219 return m_mtype;
5220}
5221
5223{
5224 return m_mtype==MemberType::Signal;
5225}
5226
5228{
5229 return m_mtype==MemberType::Slot;
5230}
5231
5233{
5234 return m_mtype==MemberType::Variable;
5235}
5236
5238{
5239 return m_mtype==MemberType::Enumeration;
5240}
5241
5243{
5244 return m_mtype==MemberType::EnumValue;
5245}
5246
5248{
5249 return m_mtype==MemberType::Typedef;
5250}
5251
5253{
5254 return m_mtype==MemberType::Sequence;
5255}
5256
5258{
5259 return m_mtype==MemberType::Dictionary;
5260}
5261
5263{
5264 return m_mtype==MemberType::Function;
5265}
5266
5268{
5269 return m_mtype==MemberType::Variable &&
5271}
5272
5274{
5275 return m_mtype==MemberType::Define;
5276}
5277
5279{
5280 return m_mtype==MemberType::Friend;
5281}
5282
5284{
5285 return m_mtype==MemberType::DCOP;
5286}
5287
5289{
5290 return m_mtype==MemberType::Property;
5291}
5292
5294{
5295 return m_mtype==MemberType::Event;
5296}
5297
5299{
5300 return m_related == Relationship::Related;
5301}
5302
5304{
5305 return m_related == Relationship::Foreign;
5306}
5307
5309{
5310 return m_stat;
5311}
5312
5314{
5315 return m_memSpec.isInline();
5316}
5317
5319{
5320 return m_memSpec.isExplicit();
5321}
5322
5324{
5325 return m_memSpec.isMutable();
5326}
5327
5329{
5330 return m_memSpec.isThreadLocal();
5331}
5332
5334{
5335 return m_memSpec.isGettable();
5336}
5337
5339{
5340 return m_memSpec.isPrivateGettable();
5341}
5342
5344{
5345 return m_memSpec.isProtectedGettable();
5346}
5347
5349{
5350 return m_memSpec.isSettable();
5351}
5352
5354{
5355 return m_memSpec.isPrivateSettable();
5356}
5357
5359{
5360 return m_memSpec.isProtectedSettable();
5361}
5362
5364{
5365 return m_memSpec.isAddable();
5366}
5367
5369{
5370 return m_memSpec.isRemovable();
5371}
5372
5374{
5375 return m_memSpec.isRaisable();
5376}
5377
5379{
5380 return m_memSpec.isReadable();
5381}
5382
5384{
5385 return m_memSpec.isWritable();
5386}
5387
5389{
5390 return m_memSpec.isFinal();
5391}
5392
5394{
5395 return m_memSpec.isNew();
5396}
5397
5399{
5400 return m_memSpec.isSealed();
5401}
5402
5404{
5405 return m_memSpec.isOverride();
5406}
5407
5409{
5410 return m_memSpec.isInitonly();
5411}
5412
5414{
5415 return m_memSpec.isAbstract();
5416}
5417
5419{
5420 return m_memSpec.isOptional();
5421}
5422
5424{
5425 return m_memSpec.isRequired();
5426}
5427
5429{
5430 return m_memSpec.isNonAtomic();
5431}
5432
5434{
5435 return m_memSpec.isCopy();
5436}
5437
5439{
5440 return m_memSpec.isAssign();
5441}
5442
5444{
5445 return m_memSpec.isRetain();
5446}
5447
5449{
5450 return m_memSpec.isWeak();
5451}
5452
5454{
5455 return m_memSpec.isStrong();
5456}
5457
5459{
5460 return m_memSpec.isEnumStruct();
5461}
5462
5464{
5465 return m_mtype==MemberType::EnumValue &&
5466 m_enumScope &&
5468}
5469
5471{
5472 return m_memSpec.isUnretained();
5473}
5474
5476{
5477 return m_memSpec.isAlias();
5478}
5479
5481{
5482 return m_memSpec.isDefault();
5483}
5484
5486{
5487 return m_memSpec.isDelete();
5488}
5489
5491{
5492 return m_memSpec.isNoExcept();
5493}
5494
5496{
5497 return m_memSpec.isAttribute();
5498}
5499
5501{
5502 return m_memSpec.isProperty();
5503}
5504
5506{
5507 return m_memSpec.isReadonly();
5508}
5509
5511{
5512 return m_memSpec.isBound();
5513}
5514
5516{
5517 return m_memSpec.isConstrained();
5518}
5519
5521{
5522 return m_memSpec.isTransient();
5523}
5524
5526{
5527 return m_memSpec.isMaybeVoid();
5528}
5529
5531{
5532 return m_memSpec.isMaybeDefault();
5533}
5534
5536{
5537 return m_memSpec.isMaybeAmbiguous();
5538}
5539
5541{
5542 return m_memSpec.isPublished();
5543}
5544
5545
5547{
5548 return m_implOnly;
5549}
5550
5552{
5553 return m_explExt;
5554}
5555
5557{
5558 return m_tspec;
5559}
5560
5562{
5563 return isFunction() ||
5564 isSlot() ||
5565 isSignal() ||
5566 isConstructor() ||
5567 isDestructor() ||
5568 isObjCMethod() ||
5569 isFriend();
5570}
5571
5573{
5574 return m_relatedAlso;
5575}
5576
5578{
5579 return m_docEnumValues;
5580}
5581
5583{
5584 return m_annEnumType;
5585}
5586
5591
5596
5598{
5599 return m_docsForDefinition;
5600}
5601
5603{
5604 return m_enumScope;
5605}
5606
5608{
5609 return m_livesInsideEnum;
5610}
5611
5613{
5614 return m_memSpec.isLocal();
5615}
5616
5618{
5619 return m_memSpec.isNoDiscard();
5620}
5621
5623{
5624 return m_memSpec.isConstExpr();
5625}
5626
5628{
5629 return m_memSpec.isConstEval();
5630}
5631
5633{
5634 return m_memSpec.isConstInit();
5635}
5636
5638{
5639 return m_enumFields;
5640}
5641
5643{
5644 return m_examples;
5645}
5646
5648{
5649 return m_proto;
5650}
5651
5653{
5654 return m_defArgList;
5655}
5656
5658{
5659 return m_declArgList;
5660}
5661
5663{
5664 ArgumentList &decAl = m_declArgList;
5665 ArgumentList &defAl = m_defArgList;
5666 const ArgumentList &decAlSrc = md->declArgumentList();
5667 const ArgumentList &defAlSrc = md->argumentList();
5668 auto decSrc = decAlSrc.begin(), defSrc = defAlSrc.begin();
5669 for (auto decIt = decAl.begin(), defIt = defAl.begin();
5670 decIt != decAl.end() && defIt != defAl.end() && decSrc != decAlSrc.end() && defSrc != defAlSrc.end();
5671 ++decIt, ++defIt, ++decSrc, ++defSrc++)
5672 {
5673 Argument &decA = *decIt;
5674 Argument &defA = *defIt;
5675 const Argument &decAS = *decSrc;
5676 const Argument &defAS = *defSrc;
5677 if (decA.name.empty())
5678 {
5679 if (!defA.name.empty())
5680 {
5681 decA.name = defA.name;
5682 }
5683 else if (!decAS.name.empty())
5684 {
5685 decA.name = decAS.name;
5686 }
5687 else if (!defAS.name.empty())
5688 {
5689 decA.name = defAS.name;
5690 }
5691 }
5692 if (defA.name.empty())
5693 {
5694 if (!decA.name.empty())
5695 {
5696 defA.name = decA.name;
5697 }
5698 else if (!decAS.name.empty())
5699 {
5700 defA.name = decAS.name;
5701 }
5702 else if (!defAS.name.empty())
5703 {
5704 defA.name = defAS.name;
5705 }
5706 }
5707 }
5708}
5709
5711{
5712 return m_tArgList;
5713}
5714
5719
5721{
5722 return m_grpId;
5723}
5724
5729
5731{
5732 return m_hasCallGraph;
5733}
5734
5736{
5737 bool enabled = m_hasCallGraph &&
5738 (isFunction() || isSlot() || isSignal()) &&
5739 Config_getBool(HAVE_DOT);
5740 if (enabled)
5741 {
5742 bool trivial = DotCallGraph::isTrivial(this,false);
5743 return !trivial;
5744 }
5745 return false;
5746}
5747
5749{
5750 return m_hasCallerGraph;
5751}
5752
5754{
5755 bool enabled = m_hasCallerGraph &&
5756 (isFunction() || isSlot() || isSignal()) &&
5757 Config_getBool(HAVE_DOT);
5758 if (enabled)
5759 {
5760 bool trivial = DotCallGraph::isTrivial(this,true);
5761 return !trivial;
5762 }
5763 return false;
5764}
5765
5770
5775
5777{
5778 return m_hasInlineSource;
5779}
5780
5782{
5783 return m_hasEnumValues;
5784}
5785
5787{
5788 return m_templateMaster;
5789}
5790
5791std::optional<ArgumentList> MemberDefImpl::formalTemplateArguments() const
5792{
5794}
5795
5797{
5798 return m_isTypedefValCached;
5799}
5800
5805
5810
5812{
5813 //printf("MemberDefImpl::getCachedResolvedTypedef()=%s\n",qPrint(m_cachedResolvedType));
5814 return m_cachedResolvedType;
5815}
5816
5818{
5819 return m_memDef;
5820}
5821
5823{
5824 return m_memDec;
5825}
5826
5828{
5829 return m_docProvider;
5830}
5831
5833{
5834 return m_groupAlias;
5835}
5836
5841
5843{
5844 return m_declLine;
5845}
5846
5848{
5849 return m_declColumn;
5850}
5851
5852
5853//----------------------------------------------
5854
5860
5862{
5863 m_def=d;
5864}
5865
5873
5875{
5876 m_moduleDef=mod;
5877}
5878
5884
5889
5894
5899
5904
5906{
5907 for (const auto &sx : qualifiers)
5908 {
5909 bool alreadyAdded = std::find(m_qualifiers.begin(), m_qualifiers.end(), sx) != m_qualifiers.end();
5910 if (!alreadyAdded)
5911 {
5912 m_qualifiers.push_back(sx);
5913 }
5914 }
5915}
5916
5921
5923{
5924 if (lines!=-1)
5925 {
5926 m_userInitLines=lines;
5927 }
5928}
5929
5931{
5932 m_read=r;
5933}
5934
5936{
5937 m_write=w;
5938}
5939
5941{
5942 m_tspec=b;
5943}
5944
5946{
5947 m_related = Relationship::Related;
5949}
5950
5952{
5953 m_related = Relationship::Foreign;
5955}
5956
5958{
5959 m_docProvider = md;
5960}
5961
5963{
5964 m_args = as;
5965}
5966
5971
5978
5980{
5981 m_docEnumValues=value;
5982}
5983
5985{
5986 m_annEnumType = md;
5987}
5988
5993
5998
5999void MemberDefImpl::setPrototype(bool p,const DString &df,int line,size_t column)
6000{
6001 m_proto=p;
6002 if (p)
6003 {
6004 setDeclFile(df,line,column);
6005 }
6006 else
6007 {
6008 setDefFile(df,line,column);
6009 }
6010}
6011
6012void MemberDefImpl::setExplicitExternal(bool b,const DString &df,int line,size_t column)
6013{
6014 m_explExt=b;
6015 if (b)
6016 {
6017 setDeclFile(df,line,column);
6018 }
6019 else
6020 {
6021 setDefFile(df,line,column);
6022 }
6023}
6024
6025void MemberDefImpl::setDeclFile(const DString &df,int line,size_t column)
6026{
6027 m_declFileName = df;
6028 m_declLine = line;
6029 m_declColumn = column;
6030}
6031
6033{
6034 m_grpId=id;
6035}
6036
6041
6047
6052
6057
6059{
6060 m_groupAlias = md;
6061}
6062
6067
6072
6077
6079{
6080 return m_category;
6081}
6082
6084{
6085 m_category = def;
6086}
6087
6089{
6090 return m_categoryRelation;
6091}
6092
6097
6099{
6100 m_enumBaseType = type;
6101}
6102
6104{
6105 return m_enumBaseType;
6106}
6107
6109{
6110 m_requiresClause = req;
6111}
6112
6117
6118void MemberDefImpl::cacheTypedefVal(const ClassDef*val, const DString & templSpec, const DString &resolvedType)
6119{
6122 m_cachedTypedefTemplSpec=templSpec;
6123 m_cachedResolvedType=resolvedType;
6124 //printf("MemberDefImpl::cacheTypedefVal=%s m_impl=%p\n",qPrint(m_cachedResolvedType),m_impl);
6125}
6126
6128{
6129 {
6130 const ArgumentList &srcAl = bmd->argumentList();
6131 ArgumentList &dstAl = m_defArgList;
6132 auto srcIt = srcAl.begin();
6133 auto dstIt = dstAl.begin();
6134 while ( srcIt!=srcAl.end() && dstIt!=dstAl.end())
6135 {
6136 Argument &argDst = *dstIt;
6137 const Argument &argSrc = *srcIt;
6138 if (!argSrc.name.empty())
6139 {
6140 argDst.name = argSrc.name;
6141 }
6142 argDst.docs = argSrc.docs;
6143 ++srcIt;
6144 ++dstIt;
6145 }
6146 }
6147
6148 {
6149 const ArgumentList &srcAl = bmd->declArgumentList();
6150 ArgumentList &dstAl = m_declArgList;
6151 auto srcIt = srcAl.begin();
6152 auto dstIt = dstAl.begin();
6153
6154 while ( srcIt!=srcAl.end() && dstIt!=dstAl.end())
6155 {
6156 Argument &argDst = *dstIt;
6157 const Argument &argSrc = *srcIt;
6158 if (!argSrc.name.empty())
6159 {
6160 argDst.name = argSrc.name;
6161 }
6162 argDst.docs = argSrc.docs;
6163 ++srcIt;
6164 ++dstIt;
6165 }
6166 }
6167}
6168
6170{
6171 for (Argument &a : al)
6172 {
6173 a.canType.clear();
6174 }
6175}
6176
6182
6187
6189{
6190 return m_numberOfFlowKW;
6191}
6192
6193//----------------
6194
6196{
6197 return DefinitionMixin::name();
6198}
6199
6200//----------------
6201
6203{
6204 for (auto decIt = decAl.begin(), defIt = defAl.begin();
6205 decIt!= decAl.end() && defIt!= defAl.end();
6206 ++decIt, ++defIt)
6207 {
6208 Argument &decA = *decIt;
6209 Argument &defA = *defIt;
6210 if (decA.docs.empty() && !defA.docs.empty())
6211 {
6212 decA.docs = defA.docs;
6213 }
6214 else if (defA.docs.empty() && !decA.docs.empty())
6215 {
6216 defA.docs = decA.docs;
6217 }
6218 //printf("transferArgumentDocumentation(%s<->%s)\n",qPrint(decA.name),qPrint(defA.name));
6219 if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
6220 {
6221 if (decA.name.empty() && !defA.name.empty())
6222 {
6223 decA.name = defA.name;
6224 }
6225 else if (defA.name.empty() && !decA.name.empty())
6226 {
6227 defA.name = decA.name;
6228 }
6229 }
6230 }
6231}
6232
6233// returns true if the documentation has a \param or @param command or a <param> tag
6234static bool hasParamCommand(const DString &doc)
6235{
6236 size_t i=0;
6237 while ((i=doc.find("param",i))!=DString::npos)
6238 {
6239 if (i>0 && (i+5>=doc.length() || !isId(doc[i+5])))
6240 {
6241 char c = doc[i-1];
6242 // a command needs whitespace before it, so that e.g. an e-mail address does not count
6243 if (c=='<' || ((c=='\\' || c=='@') && (i==1 || disspace(doc[i-2]))))
6244 {
6245 return true;
6246 }
6247 }
6248 i+=5;
6249 }
6250 return false;
6251}
6252
6254{
6255 AUTO_TRACE("mdec='{}' mdef='{}' mdec.isPrototype={} mdef.isPrototype={}",
6256 mdec->name(), mdef->name(), mdec->isPrototype(), mdef->isPrototype());
6257 if (
6258 (!mdef->isDocTransferDone() || !mdec->isDocTransferDone()) &&
6259 (
6260 (mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
6261 (mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
6262 )
6263 )
6264 {
6265 bool sameNumTemplateArgs = mdef->templateArguments().size()==mdec->templateArguments().size();
6266
6267 ArgumentList &mdefAl = const_cast<ArgumentList&>(mdef->argumentList());
6268 ArgumentList &mdecAl = const_cast<ArgumentList&>(mdec->argumentList());
6269 if (sameNumTemplateArgs &&
6270 matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdef->typeString(),&mdefAl,
6271 mdec->getOuterScope(),mdec->getFileDef(),mdec->typeString(),&mdecAl,
6272 true,mdef->getLanguage()
6273 )
6274 ) /* match found */
6275 {
6276 AUTO_TRACE_ADD("combining definition and declaration");
6277
6278 if (Config_getBool(RESOLVE_UNNAMED_PARAMS))
6279 {
6280 mdec->resolveUnnamedParameters(mdef);
6281 }
6282
6283 // check if the definition documents its own parameters, before the documentation is merged
6284 bool mdefHasParamDocs = hasParamCommand(mdef->documentation());
6285 for (const Argument &a : mdefAl)
6286 {
6287 if (!a.docs.empty()) mdefHasParamDocs = true; // e.g. with ///< comments
6288 }
6289
6290 // first merge argument documentation
6291 transferArgumentDocumentation(mdecAl,mdefAl);
6292
6293 // get the detailed descriptions before the brief descriptions are copied, since a brief
6294 // description copied to a member that already has one is added to its detailed description
6295 DString mdefDocs = mdef->documentation();
6296 DString mdecDocs = mdec->documentation();
6297 DString mdefFile = mdef->docFile();
6298 DString mdecFile = mdec->docFile();
6299 int mdefLine = mdef->docLine();
6300 int mdecLine = mdec->docLine();
6301 bool mdefDocsForDef = mdef->isDocsForDefinition();
6302 bool mdecDocsForDef = mdec->isDocsForDefinition();
6303
6304 // copy brief description between definition and declaration
6305 DString mdefBrief = mdef->briefDescription();
6306 DString mdecBrief = mdec->briefDescription();
6307 DString mdefBriefFile = mdef->briefFile();
6308 DString mdecBriefFile = mdec->briefFile();
6309 int mdefBriefLine = mdef->briefLine();
6310 int mdecBriefLine = mdec->briefLine();
6311 if (!mdef->isDocTransferDone() && !mdecBrief.empty())
6312 {
6313 mdef->setBriefDescription(mdecBrief,mdecBriefFile,mdecBriefLine);
6314 }
6315 if (!mdec->isDocTransferDone() && !mdefBrief.empty())
6316 {
6317 mdec->setBriefDescription(mdefBrief,mdefBriefFile,mdefBriefLine);
6318 }
6319
6320 // copy detailed description between definition and declaration
6321 if (!mdec->isDocTransferDone() && !mdefDocs.empty())
6322 {
6323 //printf("transferring docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
6324 mdec->setDocumentation(mdefDocs,mdefFile,mdefLine);
6325 mdec->setDocsForDefinition(mdefDocsForDef);
6326 if (mdefAl.hasParameters())
6327 {
6328 auto mdefAlComb = stringToArgumentList(mdef->getLanguage(),mdef->argsString());
6329 transferArgumentDocumentation(mdefAl,*mdefAlComb);
6330 mdec->moveArgumentList(std::move(mdefAlComb));
6331 }
6332 }
6333 if (!mdef->isDocTransferDone() && !mdecDocs.empty())
6334 {
6335 //printf("transferring docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
6336 mdef->setDocumentation(mdecDocs,mdecFile,mdecLine);
6337 // only use the parameters of the declaration if the definition does not document its own
6338 if (!mdefHasParamDocs)
6339 {
6340 mdef->setDocsForDefinition(mdecDocsForDef);
6341 if (mdecAl.hasParameters())
6342 {
6343 auto mdecAlComb = stringToArgumentList(mdec->getLanguage(),mdec->argsString());
6344 transferArgumentDocumentation(mdecAl,*mdecAlComb);
6345 mdef->moveDeclArgumentList(std::move(mdecAlComb));
6346 }
6347 }
6348 }
6349
6350 // copy inbody documentation between definition and declaration
6351 DString mdefInbodyDocs = mdef->inbodyDocumentation();
6352 DString mdecInbodyDocs = mdec->inbodyDocumentation();
6353 DString mdefInbodyFile = mdef->inbodyFile();
6354 DString mdecInbodyFile = mdec->inbodyFile();
6355 int mdefInbodyLine = mdef->inbodyLine();
6356 int mdecInbodyLine = mdec->inbodyLine();
6357 if (!mdec->isDocTransferDone() && !mdefInbodyDocs.empty())
6358 {
6359 mdec->setInbodyDocumentation(mdefInbodyDocs,mdefInbodyFile,mdefInbodyLine);
6360 }
6361 if (!mdef->isDocTransferDone() && !mdecInbodyDocs.empty())
6362 {
6363 mdef->setInbodyDocumentation(mdecInbodyDocs,mdecInbodyFile,mdecInbodyLine);
6364 }
6365
6366 if (mdec->getStartBodyLine()!=-1 && mdef->getStartBodyLine()==-1)
6367 {
6368 //printf("body mdec->mdef %d-%d\n",mdec->getStartBodyLine(),mdef->getEndBodyLine());
6369 mdef->setBodySegment(mdec->getDefLine(),mdec->getStartBodyLine(),mdec->getEndBodyLine());
6370 mdef->setBodyDef(mdec->getBodyDef());
6371 //mdef->setBodyMember(mdec);
6372 }
6373 else if (mdef->getStartBodyLine()!=-1 && mdec->getStartBodyLine()==-1)
6374 {
6375 //printf("body mdef->mdec %d-%d\n",mdef->getStartBodyLine(),mdec->getEndBodyLine());
6376 mdec->setBodySegment(mdef->getDefLine(),mdef->getStartBodyLine(),mdef->getEndBodyLine());
6377 mdec->setBodyDef(mdef->getBodyDef());
6378 //mdec->setBodyMember(mdef);
6379 }
6382
6383 // copy group info.
6384 if (mdec->getGroupDef()==nullptr && mdef->getGroupDef()!=nullptr)
6385 {
6386 mdec->setGroupDef(mdef->getGroupDef(),
6387 mdef->getGroupPri(),
6388 mdef->docFile(),
6389 mdef->docLine(),
6390 mdef->hasDocumentation(),
6391 mdef
6392 );
6393 }
6394 else if (mdef->getGroupDef()==nullptr && mdec->getGroupDef()!=nullptr)
6395 {
6396 mdef->setGroupDef(mdec->getGroupDef(),
6397 mdec->getGroupPri(),
6398 mdec->docFile(),
6399 mdec->docLine(),
6400 mdec->hasDocumentation(),
6401 mdec
6402 );
6403 }
6404
6405
6406 mdec->mergeRefItems(mdef);
6407 mdef->mergeRefItems(mdec);
6408
6409 mdef->setMemberDeclaration(mdec);
6410 mdec->setMemberDefinition(mdef);
6411
6412 mergeMemberOverrideOptions(mdec,mdef);
6413
6414 mdef->addQualifiers(mdec->getQualifiers());
6415 mdec->addQualifiers(mdef->getQualifiers());
6416
6417 mdef->setDocTransferDone();
6418 mdec->setDocTransferDone();
6419 }
6420 }
6421}
6422
6424{
6425 if (Config_getBool(CALL_GRAPH) !=md1->hasCallGraph()) md2->overrideCallGraph(md1->hasCallGraph());
6426 if (Config_getBool(CALLER_GRAPH)!=md1->hasCallerGraph()) md2->overrideCallerGraph(md1->hasCallerGraph());
6427 if (Config_getBool(CALL_GRAPH) !=md2->hasCallGraph()) md1->overrideCallGraph( md2->hasCallGraph());
6428 if (Config_getBool(CALLER_GRAPH)!=md2->hasCallerGraph()) md1->overrideCallerGraph(md2->hasCallerGraph());
6429
6430 if (Config_getBool(SHOW_ENUM_VALUES) !=md1->hasEnumValues()) md2->overrideEnumValues(md1->hasEnumValues());
6431 if (Config_getBool(SHOW_ENUM_VALUES) !=md2->hasEnumValues()) md1->overrideEnumValues( md2->hasEnumValues());
6432
6433 if (Config_getBool(REFERENCED_BY_RELATION)!=md1->hasReferencedByRelation()) md2->overrideReferencedByRelation(md1->hasReferencedByRelation());
6434 if (Config_getBool(REFERENCES_RELATION) !=md1->hasReferencesRelation()) md2->overrideReferencesRelation(md1->hasReferencesRelation());
6435 if (Config_getBool(REFERENCED_BY_RELATION)!=md2->hasReferencedByRelation()) md1->overrideReferencedByRelation(md2->hasReferencedByRelation());
6436 if (Config_getBool(REFERENCES_RELATION) !=md2->hasReferencesRelation()) md1->overrideReferencesRelation(md2->hasReferencesRelation());
6437
6438 if (Config_getBool(INLINE_SOURCES)!=md1->hasInlineSource()) md2->overrideInlineSource(md1->hasInlineSource());
6439 if (Config_getBool(INLINE_SOURCES)!=md2->hasInlineSource()) md1->overrideInlineSource(md2->hasInlineSource());
6440}
6441
6443{
6444 if (m_templateMaster)
6445 {
6446 return m_templateMaster->briefDescription(abbr);
6447 }
6448 else
6449 {
6451 }
6452}
6453
6455{
6456 if (m_templateMaster)
6457 {
6459 }
6460 else
6461 {
6463 }
6464}
6465
6467{
6468 if (m_templateMaster)
6469 {
6471 }
6472 else
6473 {
6475 }
6476}
6477
6479{
6480 return m_typeConstraints;
6481}
6482
6483
6485 const DString &includeName,bool local, bool force)
6486{
6487 if (!force || includeName.empty()) return;
6488 //printf("MemberDefImpl::setIncludeFile(%p,%s,%d,%d)\n",fd,includeName,local,force);
6489 if (!m_incInfo) m_incInfo = std::make_unique<IncludeInfo>();
6490 m_incInfo->fileDef = fd;
6491 m_incInfo->includeName = includeName;
6493}
6494
6496{
6497 bool hideFriendCompounds = Config_getBool(HIDE_FRIEND_COMPOUNDS);
6498 bool isFriendToHide = hideFriendCompounds && isTypeAClassFriend(m_type);
6499 return isFriendToHide;
6500}
6501
6503{
6504 return isFriend() && isTypeAClassFriend(m_type);
6505}
6506
6507
6509{
6510 return !(isFriend() && isFriendToHide());
6511}
6512
6514{
6515 return isFunction() || isSlot() || isSignal();
6516}
6517
6519{
6520 return isRelated() || isForeign() || (isFriend() && !isFriendToHide());
6521}
6522
6528
6530{
6531 switch (memberType())
6532 {
6533 case MemberType::Define: return CodeSymbolType::Define;
6534 case MemberType::Function: return CodeSymbolType::Function;
6535 case MemberType::Variable: return CodeSymbolType::Variable;
6536 case MemberType::Typedef: return CodeSymbolType::Typedef;
6537 case MemberType::Enumeration: return CodeSymbolType::Enumeration;
6538 case MemberType::EnumValue: return CodeSymbolType::EnumValue;
6539 case MemberType::Signal: return CodeSymbolType::Signal;
6540 case MemberType::Slot: return CodeSymbolType::Slot;
6541 case MemberType::Friend: return CodeSymbolType::Friend;
6542 case MemberType::DCOP: return CodeSymbolType::DCOP;
6543 case MemberType::Property: return CodeSymbolType::Property;
6544 case MemberType::Event: return CodeSymbolType::Event;
6545 case MemberType::Interface: return CodeSymbolType::Interface;
6546 case MemberType::Service: return CodeSymbolType::Service;
6547 case MemberType::Sequence: return CodeSymbolType::Sequence;
6548 case MemberType::Dictionary: return CodeSymbolType::Dictionary;
6549 }
6551}
6552
6554{
6555 return m_redefineCount;
6556}
6557
6559{
6560 m_redefineCount=count;
6561}
6562
6563//-------------------------------------------------------------------------------
6564// Helpers
6565
6567
6569{
6570 MemberDefMutable *src = toMemberDefMutable(const_cast<MemberDef*>(s));
6571 MemberDefMutable *dst = toMemberDefMutable(const_cast<MemberDef*>(d));
6572 if (src==nullptr || dst==nullptr) return;
6573 //printf("--> addDocCrossReference src=%s,dst=%s\n",qPrint(src->name()),qPrint(dst->name()));
6574 if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
6575 if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
6576 src->isCallable()
6577 )
6578 {
6579 DString sourceRefName = src->sourceRefName();
6582
6583 // ---- critical section
6584 std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6585 dst->addSourceReferencedBy(src,sourceRefName);
6586 if (mdDef)
6587 {
6588 mdDef->addSourceReferencedBy(src,sourceRefName);
6589 }
6590 if (mdDecl)
6591 {
6592 mdDecl->addSourceReferencedBy(src,sourceRefName);
6593 }
6594 // ---- end critical section
6595 }
6596 if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
6597 src->isCallable()
6598 )
6599 {
6600 DString sourceRefName = dst->sourceRefName();
6603
6604 // ---- critical section
6605 std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6606 src->addSourceReferences(dst,sourceRefName);
6607 if (mdDef)
6608 {
6609 mdDef->addSourceReferences(dst,sourceRefName);
6610 }
6611 if (mdDecl)
6612 {
6613 mdDecl->addSourceReferences(dst,sourceRefName);
6614 }
6615 // ---- end critical section
6616 }
6617}
6618
6619// --- Cast functions
6620//
6622{
6623 if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
6624 {
6625 return static_cast<MemberDef*>(d);
6626 }
6627 else
6628 {
6629 return nullptr;
6630 }
6631}
6632
6634{
6635 Definition *d = toDefinition(md);
6636 if (d && typeid(*d)==typeid(MemberDefImpl))
6637 {
6638 return static_cast<MemberDef*>(d);
6639 }
6640 else
6641 {
6642 return nullptr;
6643 }
6644}
6645
6647{
6648 if (d && (typeid(*d)==typeid(MemberDefImpl) || typeid(*d)==typeid(MemberDefAliasImpl)))
6649 {
6650 return static_cast<const MemberDef*>(d);
6651 }
6652 else
6653 {
6654 return nullptr;
6655 }
6656}
6657
6659{
6660 if (d && typeid(*d)==typeid(MemberDefImpl))
6661 {
6662 return static_cast<MemberDefMutable*>(d);
6663 }
6664 else
6665 {
6666 return nullptr;
6667 }
6668}
6669
6670
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:160
SubMatch prefix() const
Return the part of the string before the match.
Definition regex.h:175
size_t position() const
Returns the position of the match or std::string::npos if no position is set.
Definition regex.h:166
SubMatch suffix() const
Return the part of the string after the match.
Definition regex.h:178
size_t length() const
Returns the position of the match or std::string::npos if no length is set.
Definition regex.h:169
std::string str() const
Returns the matching part as a string.
Definition regex.h:138
#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
bool disspace(char c)
Definition dstring.h:62
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)
static bool hasParamCommand(const DString &doc)
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:3961
DString substituteTemplateArgumentsInString(const DString &nm, const ArgumentList &formalArgs, const ArgumentList *actualArgs)
Definition util.cpp:3530
DString inlineArgListToDoc(const ArgumentList &al)
Definition util.cpp:4871
bool protectionLevelVisible(Protection prot)
Definition util.cpp:4677
DString stripFromIncludePath(const DString &path)
Definition util.cpp:227
DString detab(const DString &s, size_t &refIndent)
Definition util.cpp:5200
void stripIndentationVerbatim(DString &doc, size_t indentationLevel, bool skipFirstLine)
Definition util.cpp:4778
void writeTypeConstraints(OutputList &ol, const Definition *d, const ArgumentList &al)
Definition util.cpp:4289
DString removeRedundantWhiteSpace(const DString &s)
Definition util.cpp:427
DString tempArgListToString(const ArgumentList &al, SrcLangExt lang, bool includeDefault)
Definition util.cpp:908
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
Definition util.cpp:4174
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:1594
void addHtmlExtensionIfMissing(DString &fName)
Definition util.cpp:3937
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
Definition util.cpp:3238
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Definition util.cpp:4635
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:758
DString inlineTemplateArgListToDoc(const ArgumentList &al)
Definition util.cpp:837
void writeExamples(OutputList &ol, const ExampleList &list)
Definition util.cpp:809
A bunch of utility functions.