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