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