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