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